0

我正在编写一个 Log Unifier 程序。也就是说,我有一个生成日志的系统:my.log、my.log.1、my.log.2、my.log.3...

我希望在每次迭代中存储我从某个文件中读取的行数,以便在下一次迭代中 - 我可以从那个地方继续阅读。

问题是当文件已满时,它们会滚动:最后一个日志被删除...... my.log.2 变为 my.log.3 my.log.1 变为 my.log.2 my.log 变为 my.log .1 并创建一个新的 my.log

我当然可以使用 inode 跟踪它们——这几乎是与文件的一对一对应。

我说“几乎”,因为我担心以下情况:在我的两次迭代之间 - 一些文件被删除(假设日志记录非常快),然后是新文件被创建并且一些文件的 inode 刚刚被删除。现在的问题是 - 我会将这些文件误认为是旧文件 - 并从第 500 行(例如)而不是 0 开始读取。

所以我希望找到一种方法来解决这个问题——这里有几个我想到的方向——可以帮助你帮助我:

  1. 除 inode 之外的另一个 1 对 1 对应关系。

  2. 标记文件的能力。我考虑过使用 chmod +x 将文件标记为现有文件,对于没有这些权限的新文件-我会知道它们是新的-但是如果有人要手动更改权限,那会混淆我的程序. 所以如果你有任何其他的方法来标记。

  3. 我考虑过创建指向文件的软链接,当文件被删除时会被删除。这样我就可以知道哪些文件被删除了。

  4. 任何获取“创建日期”的方法

  5. 想到的任何想法——也许以某种巧妙的方式使用时间戳、atime、ctime、mtime——一切都会很好,只要它们能让我知道哪些文件是新的,或者任何创建一对一文件的想法文件的对应关系。

谢谢

4

1 回答 1

1

我可以想到几个替代方案:

  • 使用POSIX 扩展属性来存储有关您的程序可用于其操作的每个日志文件的元数据。

  • 旧日志文件的内容在归档后没有被修改应该是一个安全的假设,即在my.log变为之后my.log.1。您可以为每个文件(例如 SHA-256)生成一个哈希来唯一标识它。

  • 所有体面的日志格式都在每个条目中嵌入了时间戳。您可以在文件中使用第一个条目的时间戳 - 甚至整个条目本身 - 用于识别目的。日志文件通常会定期滚动,这将确保每个文件的起始时间戳不同。

于 2012-08-24T18:02:39.770 回答