Linuxログローテーションファイルが通常よりも間違ったサイズを表示します。

Linuxログローテーションファイルが通常よりも間違ったサイズを表示します。

私は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)。

この問題を解決するには、次のいずれかを実行します。

  1. 追加モードでファイルを開くようにログファイルを書き込むプログラムを再構築します。
  2. プログラムを教えてくださいもう一度開くファイルが回転したときにログファイルを生成します。 (これは通常プログラムにシグナルを送信しますが、HUPプログラムのlogrotateマニュアルを読む必要があります。)
  3. logrotateログの回転からプログラムを再起動します。

関連情報