【问题标题】:Null value in the beginning of log after logrotatelogrotate 后日志开头的空值
【发布时间】:2021-02-28 10:58:45
【问题描述】:

我正在使用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' "$1"
endscript

但是使用这个脚本会修改文件和改变流。所以日志不会被重定向到一些不存在的文件流。
我正在使用 python 日志记录模块生成日志

【问题讨论】:

    标签: python linux ubuntu logrotate


    【解决方案1】:

    同样的事情发生在我身上并且能够修复它。

    其背后的原因是旋转文件没有使用标志 O_APPEND 打开。因此,在旋转时,它仍然保持相同的写入偏移量,并从新文件的中间开始写入。该偏移量之前的所有内容都标记为 NULL,因为文件的开头是空的。

    换句话说,您在文件中完成了字符编号 n 的写入,并在触发旋转时将其截断。不是从第 0 个字符重新开始,而是从第 n+1 个字符继续,前 n 个字符将被标记为 NULL。

    为避免此问题,您必须打开带有标志 O_APPEND 的文件。

    可以在以下线程中找到更多信息: https://groups.google.com/g/comp.unix.solaris/c/Zc7ysjMGprQ?pli=1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-28
      • 2020-10-26
      • 2015-08-25
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 2019-12-14
      • 2016-09-08
      相关资源
      最近更新 更多