通用日志分析器算法

时间:2011-07-05 07:27:16

标签: java c++ algorithm data-structures

运行时的我的应用程序是写日志。现在,我需要通过检查状态消息是否已写入日志来检查索引是否已完成(请注意,日志记录是动态进行的,并且进程正在运行)。我的应用程序没有发送关于何时完成索引编制过程的信号,只记录它并执行其他操作。我是否应该连续轮询日志以检查状态是否已写入日志,但这将是一种反模式或糟糕的设计。我甚至无法忙碌等待或无所事事循环然后检查,另一个糟糕的设计。如何在不查询日志的情况下以最佳方式检查日志中输入的条目,并消耗更少的CPU周期?

3 个答案:

答案 0 :(得分:1)

如果您控制两个程序(即读取和写入日志),那么最简单的解决方案是让编写器在使用某种形式的进程间通信(例如信号)完成后通知所有侦听器。

只有在无法使用IPC的情况下,您才应该考虑更智能的轮询等待轮询方法。大多数操作系统允许您在修改文件或目录时注册回调。请查看this question以获取一些建议。

答案 1 :(得分:1)

轮询是通常的解决方案。其他解决方案需要 以某种方式协作生成过程;如果是这样的话 可能,这显然是一个更好的解决方案,但如果生成 过程是保持不知道听众(在没有意义的意义上) 知道它的存在),然后轮询是唯一有效的 解。 (根据日志记录功能,您可以 安排日志进入命名管道,然后阅读。)

请注意,如果您不这样做,轮询不一定非常昂贵 它经常发生。

答案 2 :(得分:0)

假设日志解析是您唯一的选择,您正在寻找的习语具有以下高级表示(UNIX CLI样式)

# tail -f logfile.txt | grep STATUS_PATTERN

有(1)“tail -f”打印出附加到logfile.txt的任何新行,并将它们传递给(2)执行实际模式匹配的“grep”。

(1)和(2)功能在Java / C ++中作为单独的线程/进程实现并且提供比定期轮询更轻量级的负载是微不足道的。 您还需要一些额外的功能来检测日志旋转条件。