圧縮によるログローテーション?

圧縮によるログローテーション?

Linux (CentOS 7) でプロセスを実行していますが、stdout に大量の出力が生成されます。すべてをファイルに送信すると、ファイル サイズが 1 TB を超えます。ただし、幸いなことに、出力は非常に圧縮可能で、非常に繰り返しの多いテキストが多数含まれています。

私の考えは、ここで説明されているような何らかのログローテーションプログラムを使用できるかどうかです:(stdout のログローテーション?) ですが、ログが最新でなくなると、圧縮されます (削除されることはありません)。つまり、たとえば、数 GB をファイルに書き込み、それを圧縮して、新しいファイルに書き込み続けることになるのでしょうか?

答え1

使用できますログローテートCentOS 7では、システム設定することができますスケジュールされた logrotate タスク次のようになります:

  • 次の内容を含む/etc/systemd/systemlogrotate構成ファイルを作成します。mylogrotate.config

    /path/to/your/logfile/*.log {
        compress
        copytruncate
        delaycompress
        minsize 1G
        missingok
        nomail
        notifempty
        rotate 30
    }
    

これにより、logrotate に次の操作が指示されます。

  • 古いバージョンのログ ファイルは、デフォルトで gzip で圧縮されます。
  • 古いログ ファイルを移動してオプションで新しいログ ファイルを作成するのではなく、コピーを作成した後、元のログ ファイルをその場で切り捨てます。
  • 前のログ ファイルの圧縮を次のローテーション サイクルまで延期すると、圧縮されていないログ ファイルが 2 つ残ります。
  • ログ ファイルは 1G バイトを超えるとローテーションされます。
  • ログ ファイルが見つからない場合は、エラー メッセージを発行せずに次のファイルに進みます。
  • 古いログ ファイルをどのアドレスにもメールで送信しないでください。
  • ログ ファイルは削除される前に 30 回ローテーションされるため、古いログ ファイルが 30 個あることになります。それより古いものはすべて削除されます。

systemd サービスを作成します。次のように/etc/systemd/system呼ばれるファイルを作成します。mylogrotate.service

[Unit]
Description=Rotate My Log

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/systemd/system/mylogrotate.config --state /etc/systemd/system/mylogrotate.state --verbose

このタスクをスケジュールしましょう。次のように/etc/systemd/system3番目のファイルを作成します。mylogrotate.timer

[Unit]
Description=Rotate My Log Timer

[Timer]
OnCalendar=*:00:00
Persistent=true

[Install]
WantedBy=timers.target

これにより、logrotate が 1 時間ごとに実行されます。

すべて設定されました。次に、スケジュールされたタスクを有効にします。

systemctl enable mylogrotate.timer
systemctl start mylogrotate.timer

もちろん、これをすべて root として実行します。

(私はUbuntuを使用していますが、CentOSでも問題なく動作することを期待しています)

関連情報