私はspringbootディレクトリでログローテーションを有効にして動作していますが、「content-data-svc.log」は実際には2MBですが、ls -ltrhを実行すると61MBが表示されることがわかります。
ログファイルを見ると、ログファイルに空白行が多く、ファイルサイズが大きくなります。ログファイルの50%は空き容量、残りはログエントリです。なぜこれが起こるのかご存知ですか?
[aemelics@springboot]$ ls -ltrh
total 4.6M
-rw------- 1 aemelics aemelics 1.6M Apr 11 06:44 content-data-svc.log.2.gz
-rw------- 1 aemelics aemelics 1.1M Apr 12 00:44 content-data-svc.log.1.gz
-rw------- 1 aemelics aemelics 61M Apr 12 02:00 content-data-svc.log
[aemelics@springboot]$ du -shx content-data-svc.log
2.0M content-data-svc.log
私のlogrotateエントリは次のとおりです。
[aemelics@springboot]$ cat /etc/logrotate.d/react
/logs/springboot/*.log*
{
su aemelics aemelics
missingok
daily
minsize 20M
copytruncate
notifempty
sharedscripts
compress
rotate 5
postrotate
endscript
}
答え1
の出力ではファイルが大きく見えますが、 のls
出力では非常に小さく見え、du
回転後にファイルの先頭に空きスペースがあるように見える理由は、プログラムがログファイルに書き込むすべての内容がいいえ「添付」するファイルを開きます。
ログファイルが回転すると、設定ファイルcopytruncate
で設定されているオプションを使用してlogrotate
ファイルのコピーが作成され、元のファイルが保存されます。切り取った。ファイルが切り捨てられると、その内容は効果的に削除されますが、ファイル自体は削除されません。
通常、プログラムは追加するファイルを開きます。これは、ログへのすべての新しい書き込みが次のように発生することを意味します。終わり常にファイル。ファイルが切り捨てられると、次のログ行がファイルの先頭に書き込まれます。ファイルの先頭もポイントの終わりだからです。
しかし、プログラムの場合いいえ追加モードでファイルを開くと、次の書き込みは、ファイルが切り捨てられたかどうかに関係なく、最後の書き込みが完了したファイルのオフセットに移動します。
ファイルが切り捨てられた場合は、書き込みによってlogrotate
ファイルの先頭と書き込みが発生したポイントの間に穴が開いたことを意味します。穴はヌルバイトで埋められ、エディタはvi
これを^@
。
これがあなたの場合に起こるものです。
この脆弱性のあるファイルを「スパス」ファイルと呼びます。ホール自体のヌルバイトは実際にはディスクに保存されないため、表示されるdu
サイズはやや小さいです。ただし、ファイルを最初から最後まで読み取ると、61Mのデータが読み込まれます(ファイルの論理サイズはまさにそれです)。表示されますls
)。
この問題を解決するには、次のいずれかを実行します。
- 追加モードでファイルを開くようにログファイルを書き込むプログラムを再構築します。
- プログラムを教えてくださいもう一度開くファイルが回転したときにログファイルを生成します。 (これは通常プログラムにシグナルを送信しますが、
HUP
プログラムのlogrotate
マニュアルを読む必要があります。) logrotate
ログの回転からプログラムを再起動します。