通用日志解析器算法
Posted
技术标签:
【中文标题】通用日志解析器算法【英文标题】:Generic Log Parser Algorithm 【发布时间】:2011-07-05 07:27:16 【问题描述】:我的应用程序在运行时正在写入日志。现在我需要通过检查状态消息是否已写入日志来检查索引是否完成(请注意,日志记录是动态进行的并且进程正在运行)。我的应用程序没有发送关于何时完成索引过程的信号,只是记录它并去做其他事情。我是否应该不断地轮询日志以检查状态是否已写入日志,但这将是一种反模式或糟糕的设计。我什至不能有一个忙碌的等待或无所事事的循环然后检查,另一个糟糕的设计。如何以最佳方式检查日志中输入的条目,而无需重复查询日志并消耗更少的 CPU 周期?
【问题讨论】:
【参考方案1】:轮询是通常的解决方案。其他解决方案需要 以某种方式协作生成过程;如果这是 可能,这显然是一个更可取的解决方案,但如果生成 过程是保持不知道听众(在没有的意义上 知道它的存在),那么轮询是唯一有效的 解决方案。 (根据日志记录设施,您可能能够 安排日志进入命名管道,然后读取它。)
请注意,如果您不这样做,轮询不一定那么昂贵 太频繁了。
【讨论】:
【参考方案2】:如果您控制这两个程序(即读取和写入日志),那么最简单的解决方案是让编写器在完成时使用某种形式的进程间通信(例如信号)通知所有侦听器。
只有在 IPC 不可行的情况下,您才应该考虑更智能的等待轮询更改的方法。大多数操作系统允许您在文件或目录被修改时注册回调。看看this question 以获得一些建议。
【讨论】:
【参考方案3】:假设日志解析是您唯一的选择,您正在寻找的惯用语具有以下高级表示(UNIX CLI 样式)
# tail -f logfile.txt | grep STATUS_PATTERN
这里 (1) "tail -f" 打印出任何附加到 logfile.txt 的新行并将它们传递给 (2) "grep" 执行实际的模式匹配。
(1) 和 (2) 功能在 Java/C++ 中作为单独的线程/进程实现是微不足道的,并且提供比定期轮询更轻量级的负载。 您还需要一些额外的功能来检测日志轮换条件。
【讨论】:
以上是关于通用日志解析器算法的主要内容,如果未能解决你的问题,请参考以下文章