日々蓄積されていく各種のログファイル。
そのまま放置しておくとストレージ容量を圧迫しますし、肥大化したログファイルはトラブルシューティングの際に開くのにも時間がかかるようになります。
この問題を解決するのが「logrotate」です。
一定のタイミングで既存のログを保存もしくは圧縮して新たなログファイルを生成してくれます。
CentOS Stream 9(以下、Stream 9)の環境で、Nginxのログファイルをlogrotateで整理しようとしたのですがうまく動きませんでした。
CentOS Stream 8(以下、Stream 8)とは設定方法が若干違っていたのが理由なのですが、そのあたりのことを記事にしたいと思います。
起動制御
logrotateは定期的に実行されます。
Stream 8ではanacronによって1日1回起動するようになっていますが、Stream 9ではanacronではなくsystemdのタイマーが使われているようです。
以下のコマンドにて現状のタイマー設定状況が確認できます。
systemctl list-timers
UNITがlogrotate.timerになっているものがない場合はおそらくlogrotateは動いていないと思われます。
設定ファイルの確認
当方の環境においては設定ファイルが既に存在していました。
/usr/lib/systemd/systemディレクトリの中にあったのでおそらく自動的にインストールされたものだと思います。
(ユーザーが作成したものは/etc/systemd/systemディレクトリに置くのが通例)
もし存在しない場合は以下の内容でファイルを作成します。
logrotate.service
[Unit]
Description=Rotate log files
Documentation=man:logrotate(8) man:logrotate.conf(5)
RequiresMountsFor=/var/log
ConditionACPower=true
[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf
# performance options
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7
# hardening options
# details: https://www.freedesktop.org/software/systemd/man/systemd.exec.html
# no ProtectHome for userdir logs
# no PrivateNetwork for mail deliviery
# no NoNewPrivileges for third party rotate scripts
# no RestrictSUIDSGID for creating setgid directories
LockPersonality=true
MemoryDenyWriteExecute=true
PrivateDevices=true
PrivateTmp=true
ProtectClock=true
ProtectControlGroups=true
ProtectHostname=true
ProtectKernelLogs=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectSystem=full
RestrictNamespaces=true
RestrictRealtime=true
logrotate.timer
[Unit]
Description=Daily rotation of log files
Documentation=man:logrotate(8) man:logrotate.conf(5)
[Timer]
OnCalendar=daily
AccuracySec=1h
Persistent=true
[Install]
WantedBy=timers.target
ファイルの作成後は以下のコマンドを実行して設定を反映させます。
sudo systemctl daemon-reload
Nginx用logrotate設定ファイルの作成
Nginx用のlogrotate設定ファイルを作成します。
/etc/logrotate.dディレクトリの下にnginxとして作成します。
nginx
/var/log/nginx/*.log {
daily
rotate 52
missingok
notifempty
compress
delaycompress
create 644 nginx root
sharedscripts
postrotate
if [ -f /run/nginx.pid ]; then
kill -USR1 `cat /run/nginx.pid`
fi
endscript
}
各パラメータの意味については割愛しますが、これで52世代までログファイルが保存されます。
また、古いファイルについてはgzipで圧縮されます。
タイマー起動
設定ファイル類が揃ったら以下のコマンドでタイマーを起動します。
sudo systemctl start logrotate.timer
また当該タイマーをシステム起動時にスタートさせたい場合は以下のコマンドで有効化します。
sudo systemctl enable logrotate.timer
logrotateの動作確認
これで時間がくればローテーションされるはずですが、以下のコマンドで動作確認ができます。
sudo logrotate -dv /etc/logrotate.d/nginx
-dオプションはいわゆるDry-Runなので実際にはローテーションされません。
強制的にローテーションさせたい場合は-dオプションを-fオプションに変更します。
注意点
Nginxのログが出力されるディレクトリのパーミッションによってはローテーション後に新しいログファイルに出力されず、既存のログファイルに出力され続ける現象が起こります。
ログディレクトリのパーミッションは755にする必要があるようです。
まとめ
以上でsystemdのタイマーを使ったlogrotateの設定方法の説明を終了します。
私は試していませんが、Stream 8と同じようなanacronを使った設定も可能だと思います。
やりやすい方で設定していただければと思います。
コメント