
Linux (CentOS 7) でプロセスを実行していますが、stdout に大量の出力が生成されます。すべてをファイルに送信すると、ファイル サイズが 1 TB を超えます。ただし、幸いなことに、出力は非常に圧縮可能で、非常に繰り返しの多いテキストが多数含まれています。
私の考えは、ここで説明されているような何らかのログローテーションプログラムを使用できるかどうかです:(stdout のログローテーション?) ですが、ログが最新でなくなると、圧縮されます (削除されることはありません)。つまり、たとえば、数 GB をファイルに書き込み、それを圧縮して、新しいファイルに書き込み続けることになるのでしょうか?
答え1
使用できますログローテートCentOS 7では、システム設定することができますスケジュールされた logrotate タスク次のようになります:
次の内容を含む
/etc/systemd/system
logrotate構成ファイルを作成します。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/system
3番目のファイルを作成します。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でも問題なく動作することを期待しています)