操作系统:Centos7
rsyslog:8.24.0
我让多个主机向我的中央rsyslog
服务器发送日志。我使用OMFileZipLevel
配置文件中的选项来压缩日志,然后zcat
随时都可以查看内容。
自从我升级到后rsyslog8
,每当我尝试zcat
压缩我的某个日志时都会收到以下错误:
# zcat srv1.example.com.log.gz
2021-01-06T04:46:11-08:00 srv1.example.com lab: test_msg
gzip: srv1.example.com.log.gz: unexpected end of file
如果我停止 rsyslog 服务器并访问该文件,则不会收到该错误消息。即使我启动服务器,我仍然可以看到没有 EOF 消息的日志文件,然而当我的 rsyslog 服务器收到一条消息并将其写入文件时,我开始收到相同的消息:
# zcat srv1.example.com.log.gz
2021-01-06T05:54:22-08:00 srv1.example.com lab: test_msg
gzip: srv1.example.com.log.gz: unexpected end of file
# systemctl stop rsyslog
# zcat srv1.example.com.log.gz
2021-01-06T05:54:22-08:00 srv1.example.com lab: test_msg
# systemctl start rsyslog
# zcat srv1.example.com.log.gz
2021-01-06T05:54:22-08:00 srv1.example.com lab: test_msg
srv1:~$ logger -p local5.info test_msg2 @my_rsyslog_server
# zcat srv1.example.com.log.gz
2021-01-06T03:32:09-08:00 srv1.example.com lab: hab_test
2021-01-06T05:55:27-08:00 srv1.example.com lab: test_msg2
gzip: srv1.example.com.log.gz: unexpected end of file
我能够找到一个邮件列表,其中有人提到了类似的问题,这与 rsyslog 仍打开的文件有关。
问题是我有另一个运行版本5.8.10
(Centos 6)的 rsyslog 服务器,它具有完全相同的 rsyslog 配置文件,但我的压缩日志上的 EOF 消息没有出现这样的行为。
这可能是 rsyslog 中的一个错误吗8.24.0
?
答案1
这似乎是一种正常行为。我不确定closeTimeout
参数,因为OMFileZipLevel
它通常应用于生成大量输出的服务,所以我从来没有遇到过 10 分钟(或 10 秒)没有写入文件的情况!
GZIP 是一个流压缩器,因此文件会带有文件头和文件尾,但是直到文件被视为关闭和终止时才会写入文件尾,因此 zcat 和 gunzip 在到达仍在写入的普通 gzip 文件的末尾时会发出抱怨。
使用OMFileZipLevel
只是告诉 rsyslog 将日志压缩为普通 gzip 文件,所以这仍然适用。
使用veryRobustZip
rsyslog 可以构建由一个接一个连接起来的小块 gzip 数据组成的 gzip 文件(符合 gzip 标准),并且可以允许使用 zcat 或 gunzip 无错误地提取数据(但查阅 rsyslog 帮助检查一些细节)。
尽管如此,我已经开发工具轻松管理 rsyslog 生成的压缩日志文件,无论使用哪种选项:您都可以
tail -f
像处理文本文件一样连续跟踪 .log.gz 文件,使用gztool -T
- 即使发送日志的过程突然停止然后重新启动,也会提取所有数据,这会导致 gzip 文件包含 zcat/gunzip 无法访问的数据,但 gztool 可以完美地提取
gztool -p
- 从 gzip 文件的任何部分提取数据,而无需全部读取(这对于其他工具是必需的)
只是参考使用示例的工具。
问题是为什么它在升级之前没有发生:你确定在相同的 rsyslog 配置下以前没有发生过这种情况吗?