如何在Perl中流式传输不断更改文件名的日志文件内容?

时间:2018-11-28 04:58:34

标签: linux file perl

我在Linux系统上需要一系列应用程序,基本上我需要不断地“流式输出”,甚至只是“拖尾式”输出,但是挑战在于文件名不断变化。

所有日期都经过编码(日期采用不同的格式),然后每种格式都有不同的递增格式。

它们中的大多数以一个开始并增加,但是一个没有扩展名,然后在第一个文件之后添加一个扩展名,另一个扩展名增加一个数字,但是一旦命中99,滚动将增加一个alpha并将数字返回到01然后又快又滚了起来。

我只有OS级别的外壳脚本,OS命令行实用程序和perl可供我使用,以处理这种情况,以便另一个应用程序提取和读取这些日志。

当新文件开始写入新文件时,总是总是正确创建新文件,并且将不同日志组(有些我读一些我没有读)写到同一目录,所以我不能随便抓取任何击中该目录的东西。

如果我只是简单地'tail -n 1000000 -f |'今天,它们对于我正在使用的阅读器应用程序来说是正常的,直到文件更改并且我无法在阅读器应用程序中设置文件列表范围,但是可以对其进行预处理,因此它们基本上以连续流的形式出现在阅读器与直接与阅读器之间调用命令以读取它们。 simple Perl log reader like this也适用于静态文件名,但不适用于动态文件名。至关重要的是,我不要重新处理任何日志行,而只是捕获正在写入日志的新行。

我承认我不是Perl专家,到目前为止,我一直能找到的最佳答案/线索是使用Perl's Glob function to possibly来做到这一点,但是我发现的示例基本上可以重新处理所有问题。每次运行中的文件数量似乎都停止了。

我正在处理的多个应用程序中使用的示例文件名。

  • appA _YYMMDD.log
  • appA _YYMMDD_0001.log
  • appA _YYMMDD_0002.log
  • WS01 APPB _YYMMDD.log
  • WS02 APPB _YYMMDD.log
  • WS03 AppB _YYMMDD.log
  • APPC MMDD_A01.log
  • APPC MMDD_B01.log
  • YYYYMMDD_001_ APPD .log

如上所述,文件没有相同的索引节点,并且由于其中写入了很多内容,因此无法简单地监视目录的更改。在开发系统上,它已将50多个日志写入目录和数千个文件,我仅尝试检索5。我正在查看是否可以使用multitail来尝试该建议,但目前尚不可用,并安装了任何建议。环境中的其他RPM通常是数月之久。

ls -i 24792 APPA_180901.log 24805 APPA__180902.log 17011 APPA__180903.log 17072 APPA__180904.log 24644 APPA__180905.log 17081 APPA__180906.log 17115 APPA__180907.log

因此,实际上我想做的事情的根源是连续不断的流,无论文件名是否更改,不必重复运行extract命令,也不必在数据馈送中有大的中断,而某些脚本会找出该文件正在登录已更改。我不需要解析内容(我的其他应用程序也可以)。.是否有一种简单的方法来处理此更改的文件名?

2 个答案:

答案 0 :(得分:1)

如何使用Linux inotify监视日志目录中的更改,例如$inputString = "['A'|'AA']['B'|'BB']['C'|'CC']"; $inputString = rtrim($inputString,"]"); $inputString = ltrim($inputString,"["); print_r(explode("][", $inputString)); /*Array ( [0] => 'A'|'AA' [1] => 'B'|'BB' [2] => 'C'|'CC' )*/ ?然后,您可以检测到何时创建新的日志文件,停止从旧的日志文件中读取并开始从新的日志文件中读取。

答案 1 :(得分:1)

尝试tailswitch。我创建此脚本的目的是跟踪每天循环的日志文件,它们的名称上带有YYYY-MM-DD。要使用此脚本,您只需说:

% tailswitch '*.log'

引号可防止外壳解释glob模式。该脚本将不时执行glob模式,以根据文件名切换到新文件。

相关问题