首页 > 解决方案 > 如何在 perl 中流式传输不断更改文件名的日志文件内容?

问题描述

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

它们都是日期编码的(日期采用不同的格式),然后每个都有不同的增量格式。

它们中的大多数以一个开头并增加,但一个没有扩展名,然后在第一个文件之后添加一个扩展名,另一个增加一个数字,但一旦达到 99 滚动以增加一个 alpha 并将数字返回到 01 然后向上再次,因为它滚动得如此之快。

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

新文件总是在开始写入新文件时正确创建,并且不同日志组(有些我正在阅读,有些我没有)被写入同一个目录,所以我不能只拾取任何到达该目录的内容。

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

我承认我不是 Perl 专家,到目前为止我能找到的最好的答案/线索是使用Perl 的 Glob 函数来可能做到这一点,但我发现的示例基本上是重新处理所有文件每次运行似乎都会停止。

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

如上所述,这些文件没有相同的 inode,并且简单地监视目录的更改是不可能的,因为那里写了很多东西。在开发系统上,它有 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__18097.log

因此,我真正想做的事情的根源只是一个连续的流,无论文件名是否更改,也不必重复运行提取命令,也不必在数据馈送中有大的中断,而某些脚本会发现文件被记录到已经改变。我不需要解析内容(我的其他应用程序会这样做).. 有没有一种简单的方法来处理这个不断变化的文件名?

标签: linuxfileperl

解决方案


试试tailswitch。我创建了这个脚本来跟踪每天轮换的日志文件,并且它们的名称上有 YYYY-MM-DD。要使用此脚本,您只需说:

% tailswitch '*.log'

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


推荐阅读