1

我有这种情况:我用 perl 守护进程解析一些日志文件。该守护进程将数据写入 mysql db。

日志文件可以:

  1. 被旋转('由文件大小和一些逻辑解决')
  2. 不存在(尾部中的“ignore_nonexistant”参数)

守护进程:

  1. 可以被杀
  2. Can因为某种原因死了。

我使用 File::Tail 来跟踪文件。对于创建日期或文件大小的文件轮换机制可以提供帮助。我应该使用什么机制从文件中的某个位置开始tail?(假设有很多这样的守护进程,对文件系统没有写访问权)。

我考虑过数据库中的位置变量,但这对我没有帮助。

也许是某种将位置参数传递给父进程的机制?

我只是不想重新发明自行车。

4

2 回答 2

2

File::Tail 已经检测到旋转并继续从新文件中读取。

为了处理守护进程死亡和重新启动,您是否可以在数据库中查询守护进程重新启动时写入的最后一条记录,并跳过日志文件行,直到您到达后面的行?

于 2011-05-18T15:30:18.187 回答
2

试试http://search.cpan.org/dist/Log-Unrotate/。如果您希望将位置文件存储在 DB 而不是本地文件系统中,则必须实现自己的Log::Unrotate::Cursor类,但这应该是微不足道的。

我们在生产中编写并使用Log::Unrotate了 5 年,它非常努力地从不跳过任何数据。(如果您的光标变得无效,它会非常努力地抛出异常,例如,如果在阅读器由于某种原因而无法工作时日志被旋转了几次。您可能需要启用autofix_cursor选项来更改此行为)。

另请查看http://search.cpan.org/dist/File-LogReader/。我从未使用过它,但它应该可以解决相同的任务。

于 2011-05-19T22:20:58.860 回答