Linux の logrotation ファイルのサイズが通常より間違っている

Linux の logrotation ファイルのサイズが通常より間違っている

springboot ディレクトリで logrotation を有効にしましたが、動作しています。しかし、表示される内容は、「content-data-svc.log」は実際には 2 MB ですが、ls -ltrh を実行すると 61 MB と表示されます。

ログ ファイルを表示すると、ログ ファイル内に空の行が多くなり、ファイル サイズが大きくなっています。ログ ファイルの 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、これは書き込みによって、ファイルの先頭と書き込みが発生したポイントの間に穴が作成されたことを意味します。この穴は null バイトでいっぱいで、エディターではviとして表示されます^@

あなたの場合にはこれが起こります。

このようなホールがあるファイルは、「スパース」ファイルと呼ばれます。ホール自体のヌル バイトは実際にはディスクに保存されないため、duサイズが非常に小さく表示されますが、ファイルを最初から最後まで読み取ると、61 MB のデータが読み取られます (ls表示されるのはファイルの論理サイズです)。

これを解決するには、

  1. ログファイルに書き込むプログラムを書き直して、ファイルを追加モードで開くようにするか、
  2. プログラムに指示する再開するファイルがローテーションされたときのログファイル(これは通常、プログラムHUPに から信号を送信することによって行われますlogrotateが、プログラムのマニュアルを読む必要があります)、または
  3. logrotateログがローテーションされた時点からプログラムを再起動します。

関連情報