簡體   English   中英

logrotate后日志開頭的空值

[英]Null value in the beginning of log after logrotate

我正在使用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 日志模塊生成日志

同樣的事情發生在我身上並且能夠修復它。

其背后的原因是旋轉文件沒有使用標志 O_APPEND 打開。 因此,在旋轉時它仍然保持相同的寫入偏移量並從新文件的中間開始寫入。 該偏移量之前的所有內容都標記為 NULL,因為文件的開頭是空的。

換句話說,您完成在文件中寫入字符編號 n 並在觸發旋轉時將其截斷。 不是從第 0 個字符重新開始,而是從第 n+1 個字符繼續,前 n 個字符將被標記為 NULL。

為避免此問題,您必須使用標志 O_APPEND 打開文件。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM