2012-08-24 64 views
0

我在写一个Log Unifier程序。也就是说,我有一个生成日志的系统: my.log,my.log.1,my.log.2,my.log.3 ...一对一对应的文件 - 在unix中 - 日志文件

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

的问题是,当这些文件都满了,他们推出: 最后的日志被删除 ... my.log.2成为my.log.3 my.log.1变得my.log。 2 my.log变得my.log.1 和新my.log创建

我可以ofcourse让他们的跟踪,使用的inode - 这几乎是一到一一对应的文件。

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

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

  1. 除了inode以外的其他1对1对应关系。

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

  3. 我曾想过如何创建指向删除文件时被删除的文件的软链接。这将让我知道哪些文件被删除。

  4. 任何方式来获得“创建日期”

  5. 想到的任何想法 - 也许使用时间戳,的atime,的ctime,修改时间以某种巧妙的方式 - 都将是很好的,只要他们将让我知道哪些文件是新的,或者创建与文件一一对应的任何想法。

谢谢

回答

1

我能想到的几个备选方案:

  • 使用POSIX extended attributes来存储你的程序可以使用它的操作每个日志文件的元数据。

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

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