logrotate之后日志开头的Null值

2024-04-26 15:05:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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
}

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

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

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

postrotate
   sed -i -e 's/\o00//g' "$1"
endscript

但使用此脚本将修改文件并更改流。所以日志不会被重定向到某个不存在的文件流。
我正在使用python日志模块生成日志


Tags: 文件脚本logsizerootcompresssudaily
1条回答
网友
1楼 · 发布于 2024-04-26 15:05:56

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

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

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

为了避免这个问题,您必须打开带有O_APPEND标志的文件

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

相关问题 更多 >