3

我在做什么

我正在实现一个基于 python/kqueue (FreeBSD) 的解决方案来跟踪对特定日志文件的更改,当满足 KQ_NOTE_WRITE fflag 时,对文件的更改由我的 python 脚本中的另一个函数拾取和处理。

为什么我这样做

最终,我将获取最新的日志文件条目并将其发送到其他地方,作为快速'n'dirty 会计系统的一部分。

我认为我需要知道的

1)由于日志文件可以看到高流量的时期,我想知道是否会有任何“原子性”,即在将最新条目传递给日志文件时,我们会“错过”一个新条目吗?事实上,kqueue 是一个“队列”,我认为不是,但历史告诉我,我通常最终会觉得自己像个笨蛋。

2) kqueue 是否保证为每个事件触发,或者多个事件是否可以通过?我想象的情况是日志文件几乎同时产生 2 个单独的条目。

感谢任何智慧/建议。

4

1 回答 1

4

你的怀疑是正确的。:-)

如果在发生第二个相同事件时,kqueue“事件”不在被消耗的过程中,则它被“扩展”。也就是说,假设低级别的事件序列是这样的:

1: you start monitoring the log file for writes
2: something writes to the log file (this adds a "write" notice to the kqueue)
3: your process is notified, but does not have a chance to go look yet
4: something (same something as step 2, or different, does not matter)
   writes more to the log file (this merely "expands" the existing notice,
   with no effect in this case)
5: your process finally gets a chance to read the "file was written" notice
   from the kqueue

当第 5 步发生时,“文件已写入”通知将只是一个通知。由您的代码决定写入了多少。例如,您可以fstat()在第 1 步检查文件的长度,然后fstat()在第 5 步之后检查另一个文件的长度。如果文件只是附加到,则这些点之间的大小差异就是您关心的“新数据”。

请注意,如果您在第 1 步看到(比如说)100 个字节,在第 5 步之后看到 500 个字节——比如说,在第 7 步:

7: you fstat the file

后来得到另一个“文件已写入”通知,实际上可能有一个“步骤 6”,文件发生了另一个写入。因此,即使您收到添加了字节的通知,您也应该准备好在后面的步骤中发现添加了 0 个字节,因为在将注释附加到 kqueue 之后您可能已经阅读了它们。

如果您正在观看syslog类型日志,请注意它们会随着文件被重命名(然后有时会被压缩等)而“翻转”,并创建一个新文件,例如,“messages”变为“messages.0.bz2”和一个新的“消息”被创建。您可以查看目录以及文件,并检查是否有新文件创建,以捕捉此类情况。

于 2013-03-08T10:37:51.137 回答