合并可能被截断的 gzip 日志文件

合并可能被截断的 gzip 日志文件

我每天都有多个日志文件需要合并在一起。每个都来自不同的服务器。将它们放在那里的工作有时会被中断并且文件会被截断。在这种情况下,该文件下次运行时会使用不同的名称写入。所以我最终可能会得到一个日志文件列表,例如:

  • server-1-log.gz(昨天的日志文件)
  • server-1-log.1.gz(今天的日志文件在传输时被中断并被截断)
  • server-1-log.2.gz(今天的日志文件已重新传输且完好无损)
  • server-2-log.gz(昨天的日志文件)
  • server-2-log.1.gz(今天的日志文件)

所有日志文件的每一行都以时间戳开头,因此对它们进行排序和去重复是相当简单的。我一直在尝试使用以下命令合并这些文件:

zcat *.gz | sort | uniq | gzip > /tmp/merged.gz

问题是截断的日志文件会产生以下错误zcat

gzip:server-1-log.1.gz:意外的文件结尾

事实证明,当 zcat 遇到此错误时,它会完全退出,而不会从其他文件中读取所有数据。我最终丢失了其他好文件中存在的数据,因为其中一个文件已损坏。我怎样才能解决这个问题?

  • 我可以告诉zcat不要因错误而退出吗?我在手册页中没有看到任何内容。
  • 我可以在调用之前修复截断的 gzip 文件zcat吗?
  • 我可以使用不同的减压程序吗?

答案1

我猜你正在使用 的gzip脚本版本zcat。它只是执行gzip -dc,不能被告知忽略错误并在遇到错误时停止。

针对单个损坏的压缩文件的记录修复是运行它们zcat,因此您不会在那里获得太多帮助......

要处理您的文件,您可以循环它们(使用循环forxargs您发现的那样),或者使用祖蒂尔斯它有一个版本,zcat当遇到错误时会继续处理。

答案2

我找到了一种方法来做到这一点。我可以通过每个文件自己的zcat.为此,我可以xargs -n 1为每个文件启动一个 zcat 实例:

echo *.gz | xargs -n 1 zcat | sort | uniq | gzip > /tmp/merged.gz

单个 zcat 仍然失败,但其他 zcat 运行完成。它不会杀死整个管道。

答案3

尝试超快速系统日志搜索器

(假设你有已安装铁锈

cargo install super_speedy_syslog_searcher

然后

s4 server-*.gz

s4可以读取.gz文件。

相关内容