Linux 如何在perl中传输不断更改文件名的日志文件内容?

Linux 如何在perl中传输不断更改文件名的日志文件内容?,linux,file,perl,Linux,File,Perl,我在Linux系统上开发了一系列应用程序,基本上我需要不断地“流式”输出,甚至只是“尾式”输出,但挑战是文件名不断滚动和变化 这些都是日期编码的(日期的格式不同),然后每个都有不同的递增格式 大多数都是从1开始增加,但其中一个没有扩展名,然后在第一个文件后添加扩展名,另一个增加一个数字,但一旦达到99个滚动,则增加一个字母,并将数字返回到01,然后随着滚动速度的加快再次增加 我只有操作系统级的shell脚本、操作系统命令行实用程序和perl可供我处理这种情况,让另一个应用程序读取这些日志 新文件

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

这些都是日期编码的(日期的格式不同),然后每个都有不同的递增格式

大多数都是从1开始增加,但其中一个没有扩展名,然后在第一个文件后添加扩展名,另一个增加一个数字,但一旦达到99个滚动,则增加一个字母,并将数字返回到01,然后随着滚动速度的加快再次增加

我只有操作系统级的shell脚本、操作系统命令行实用程序和perl可供我处理这种情况,让另一个应用程序读取这些日志

新文件总是在它开始写入新文件时创建的,不同日志组(有些我正在读取,有些我没有)正在写入同一个目录,因此我不能只拾取任何命中该目录的内容

如果我今天简单地“tail-n1000000-f |”,这对我正在使用的读卡器应用程序很好,直到文件更改,我无法在读卡器应用程序中设置文件列表范围,但可以预处理它们,使它们基本上以连续流的形式显示给读卡器,而不是读卡器直接调用命令来读取它们。A也适用于静态文件名,但不适用于动态文件名。重要的是,我不重新处理任何日志行,只捕获写入日志的新行

我承认我不是Perl大师,到目前为止我能找到的最好的答案/线索是使用do this,但我发现的示例基本上是在每次运行时重新处理所有文件,然后似乎停止了

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

  • appA\u YYMMDD.log
  • appA\u YYMMDD\u 0001.log
  • appA\u YYMMDD\u 0002.log
  • WS01APPB\u YYMMDD.log
  • WS02APPB\u YYMMDD.log
  • WS03AppB\u YYMMDD.log
  • APPCMMDD_A01.log
  • APPCMMDD_B01.log
  • YYYYMMDD_001_APPD.log
如上所述,这些文件没有相同的inode,并且不可能简单地监视目录的更改,因为其中写入了很多内容。在dev系统上,有50多个日志被写入目录和数千个文件,我只想检索5个。我正在考虑是否可以让multitail尝试这一建议,但目前还没有,在环境中安装任何额外的RPM通常需要多个月的时间

ls-i 24792 APPA_180901.log 24805 APPA_uu180902.log 17011 APPA_uu180903.log 17072 APPA_uu180904.log 24644 APPA_uu180905.log 17081 APPA_uu180906.log 17115 APPA_uu180907.log


因此,实际上,我试图做的事情的根源只是一个连续的流,不管文件名是否更改,不必重复运行extract命令,也不必在某些脚本发现记录到的文件已更改时在数据提要中出现大的中断。我不需要解析内容(我的另一个应用程序就是这样做的)。。是否有一种简单的方法来处理此更改的文件名?

如何使用Linux inotify(例如,
Linux::inotify2
)监视日志目录的更改?然后,您可以检测何时创建新日志文件,停止从旧日志文件读取,并开始从新日志文件读取。

尝试。我创建这个脚本是为了跟踪日志文件,这些文件每天轮换一次,名称上有YYYY-MM-DD。要使用此脚本,只需说:

% tailswitch '*.log'

引用阻止shell解释glob模式。脚本将不时执行glob模式,根据文件名切换到较新的文件。

为什么以及如何更改文件名?inode是否保持不变?您需要跟踪单个文件还是只获取所有日志?编写该应用程序(我没有控制)的目的是将其完全转储并忘记。每个文件都是独立的,而不是原始文件的扩展名,在文件本身中没有开始或结束标记..我的印象是文件被附加到文件中,并且您希望继续获取新内容。。。这不对吗?或者你的意思是你需要读取的总是新文件,但它们的名称很难预测?我想继续从它们那里获取新内容,就好像它们基本上是一个系统日志提要,但作为尾部读取会在每个文件的末尾停止,然后移到下一个文件(我已经了解了每个文件的约定)我在寻找一种方法,根据更改文件名和在任何给定时间只读取最新的文件,基本上逐行为连续读取编写脚本。这是我的想法,但(对我来说)不清楚他们是否需要跟踪单个文件,在这种情况下,第一个问题(对我来说)是inode是否更改。这就是我建议监视目录而不是文件的原因。任何文件名更改都会触发监视程序。是的,这将触发新文件的监视程序。但如何找出新文件添加到哪个旧文件?如果这就是正在发生的事情(如果需要知道的话)。我不知道这个问题到底发生了什么,我认为什么会影响如何/监控什么。我不确定这是否有效,但至少我正在研究它。在问题中添加一些附加信息。inotify是否可以代替路径来处理目录下文件的正则表达式模式?我将在inotify目录监视程序中实现文件名检测,即您的正则表达式->日志文件类型。您需要一个散列,用于保存每个受监控类型的当前受监控日志文件。如果代码识别为日志文件类型添加了新文件,则表示日志文件已更改,即