logrotate copytruncate 之后为空

logrotate copytruncate 之后为空

我用它logrotate来管理我的日志。因为我必须管理一堆日志文件。我的 logrotate 配置如下

/log/typeA*.log
/log/typeB*.log
/log/typeC*.log{
        daily
        rotate 7
        copytruncate
        size 1M
        compress
        su root root
        create 0644 root root
        missingok
}

logrotation 完成后,我在文件开头看到一堆空字符。看起来像

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@

看起来像是无限长的字符串。文件大小也看起来相似。有解决方案建议https://serverfault.com/a/510470使用类似 postrotate 脚本

postrotate
   sed -i -e 's/\o00//g' session.timing.1
endscript

但是当我将它应用于一堆文件时,我没有特定的名称,比如session.timing.1有没有什么方法可以通用地完成它?我希望对所有文件执行此操作等等typeA_date1.log typeA_date2.log……或者你建议任何其他有用的方法吗?

答案1

我遇到了同样的问题。读完logrotate代码,我认为当程序不断用打开的文件写入日志消息时,只能使用copytruncate模式,但是这种模式也会使文件空洞,ftruncate并填充NULL字符。

一些技巧:

  1. 改变日志的编程方法,不需要使用copytruncate模式
  2. 由 systemd 使用syslogconfigure 进行管理,参见如何
  3. 由 systemd(版本 236 或更新版本)管理,可以设置StandardOutput为文件,因此也许可以使用logrotate模式create(不确定)

相关内容