【问题标题】:perl File::Tail syncronizationperl 文件::尾同步
【发布时间】:2011-08-28 03:45:08
【问题描述】:

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

日志文件可以:

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

守护进程:

  1. 可以被杀死
  2. 可能由于某种原因而死亡。

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

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

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

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

【问题讨论】:

    标签: perl synchronization daemon tail


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 想象有一个要解析的文件列表。你运行你的主(父)守护进程,为每个文件生成子进程。现在它的工作原理是这样的:记住最后一行被解析并监控文件大小和文件长度(行数)。如果出现问题,它会在 file.log file1.log file.1.tar.gz 和类似 file*bydate.log -> 中找到该行并从最后一个位置开始。此行存储在 mysql db 中。但这就是每一行更新命令
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 2011-02-06
      • 2012-08-23
      • 2015-05-29
      • 2017-09-12
      • 1970-01-01
      相关资源
      最近更新 更多