我正在编写一个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。
所以我希望找到一种方法来解决这个问题 - 这里有一些我想过的方向 - 这可能对你有所帮助:
除了inode之外的其他一对一对应。
标记文件的功能。我想过使用chmod + x将文件标记为 现有文件,以及没有这些权限的新文件 - 我会知道它们是新的 - 但如果有人要手动更改权限,那会使我的程序混淆。所以,如果你有任何其他方式来标记。
我考虑创建指向删除文件时删除的文件的软链接。这样我就可以知道哪些文件被删除了。
获取“创建日期”的任何方式
想到任何想法 - 也许以某种聪明的方式使用时间戳,atime,ctime,mtime - 一切都会好的,只要它们能让我知道哪些文件是新文件,或任何想法创建与文件一一对应。
谢谢
答案 0 :(得分:1)
我可以想到几个选择:
使用POSIX extended attributes存储有关程序可用于其操作的每个日志文件的元数据。
应该可以安全地假设旧日志文件的内容在归档后不会被修改,即在my.log
变为my.log.1
之后。您可以为每个文件生成一个哈希值(例如SHA-256)以唯一标识它。
所有体面的日志格式都在每个条目中嵌入了一个时间戳。您可以在文件中使用第一个条目的时间戳 - 甚至整个条目本身 - 用于识别目的。日志文件通常定期滚动,这将确保每个文件的起始时间戳不同。