logrotateで(SLURMの)ログを分けてとりたい。
| 登録日 | :2024/05/10 04:31 |
|---|---|
| カテゴリ | :Linux |
slurmのログ(特に管理ノードログ)など、アプリケーションによってはデフォルトではlogrotateされないので、非常に肥大化する。これがサーバを圧迫したり、後々ログを調べようとしたときに弊害がある。そこで、logrotateを用いてログを適切に分割、および圧縮して容量を圧迫しないようにしたい。
1 logrotateの設定方法
logrotateの設定ファイルには2つある。
- logrotate.conf に直接記述する
- logrotate.d 以下に設定ファイルを作成する
書式のサンプルは以下の通り。
/var/log/sample-service/sample.log { # 対象のログファイル
ifempty # ログファイルが空でもローテーションする
dateformat .%Y%m%d # dateフォーマットを任意のものに変更する
missingok # ログファイルがなくてもエラーを出さない
compress # 圧縮する
daily # 毎日ローテートする
rotate 10 # 10世代分古いログを残す
postrotate # ローテート後にsyslogを再起動
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
ここで、Zabbixは自動的にlogrotateが設定されるので、その設定ファイルを見てみる。
[root@rockylinux_test_zabbix logrotate.d]# cat zabbix-agent
/var/log/zabbix/zabbix_agentd.log {
weekly
rotate 12
compress
delaycompress
missingok
notifempty
create 0664 zabbix zabbix
}
それぞれのオプションの意味
設定内容 値
対象のログ /var/log/zabbix/zabbix_agentd.log
ローテート期間 週間
何世代ログを残すか 12日
postrotate ローテート後にsyslogを再起動
- weekly #ログを毎週ローテーションする
- rotate 12 #ローテーションする回数
- compress # ローテーションしたログをgzipで圧縮
- delaycompress #ログの圧縮作業を次回のローテーション時まで遅らせる。compressと共に指定
- missingok #ログファイルが存在しなくてもエラーを出さずに処理を続行
- notifempty #ログファイルが空ならローテーションしない
- create 0664 zabbix zabbix #[パーミッション ユーザー名 グループ名] ローテーション後に空のログファイルを新規作成。ファイルのパーミッション、ユーザー名、グループ名を指定可能
これにより、以下のように圧縮されたログローテーションが行われている。
合計 804
-rw-rw-r--. 1 zabbix zabbix 0 5月 6 08:31 zabbix_agentd.log
-rw-rw-r--. 1 zabbix zabbix 1314 3月 25 16:02 zabbix_agentd.log-20240325.gz
-rw-rw-r--. 1 zabbix zabbix 1774 5月 6 07:39 zabbix_agentd.log-20240506
-rw-rw-r--. 1 zabbix zabbix 1729 5月 6 15:08 zabbix_server.log
-rw-rw-r--. 1 zabbix zabbix 36272 3月 25 16:01 zabbix_server.log-20240325.gz
-rw-rw-r--. 1 zabbix zabbix 771628 5月 6 08:08 zabbix_server.log-20240506
[root@rockylinux_test_zabbix logrotate.d]#
2 slurmのログをlogrotateしてみよう
上記zabbixの設定を参考にlogrotateしてみる。
[root@headnode logrotate.d]# cat slurmd
/var/log/slurmd.log {
daily
rotate 2
compress
delaycompress
missingok
notifempty
}
[root@headnode logrotate.d]# ll /var/log/slurmd.log
-rw-------. 1 root root 7912 5月 10 04:38 /var/log/slurmd.log
[root@headnode logrotate.d]# cat slurmctld
/var/log/slurmctld.log {
daily
rotate 2
compress
delaycompress
missingok
notifempty
}
[root@headnode logrotate.d]# ll /var/log/slurmctld.log
-rw-------. 1 root root 3130420 5月 10 04:38 /var/log/slurmctld.log
[root@headnode logrotate.d]#
影響を細かく確認したいので、daily、rotate2とした。
ひとまず、結果をみたいので強制的にlogrotateを実行してみる。
logrotate -f /etc/logrotate.conf
結果、本日のログが作成されていることが分かった
-rw-------. 1 root root 0 5月 10 05:04 slurmctld.log
-rw-------. 1 root root 3130420 5月 10 04:38 slurmctld.log-20240510
-rw-------. 1 root root 0 5月 10 05:04 slurmd.log
-rw-------. 1 root root 7912 5月 10 04:38 slurmd.log-20240510
これで、しばらく様子を見ようと思う。
テスト結果
rotate 1としてテストしたところ、過去ログが消えることがわかった。そのため、ログをできる限り消したくない場合は、rotateをできるだけ長くしていた方が良いと思う。
例えば、weeklyとして、rotate回数は366とすれば、7年は保存されると思われる。
-rw-------. 1 root root 0 5月 10 05:04 slurmctld.log
-rw-------. 1 root root 3130420 5月 10 04:38 slurmctld.log-20240510
-rw-------. 1 root root 0 5月 11 03:25 slurmctld.log
-rw-------. 1 root root 0 5月 10 05:04 slurmctld.log-20240511
参考)
https://qiita.com/sugar_salt75/items/88acecf9e864cbeee436
https://qiita.com/Esfahan/items/a8058f1eb593170855a1
Apendix
SLURMのログローテーションをすると、ローテーションされたファイルに記述されてしまう問題があります。
そのため、ローテーション後にログファイルが適切に切り替わるよう、postrotateスクリプトを使用してログファイルを再オープンする必要があります。特に、ログファイルをローテートした後にアプリケーションにSIGHUPシグナルを送信する必要がある場合があります。
対処するため、以下のように書き換えます。
/var/log/slurm/slurmctld.log /var/log/slurm/slurmd.log {
daily
rotate 7
compress
missingok
notifempty
sharedscripts
postrotate
/bin/systemctl reload slurmctld >/dev/null 2>&1 || true
endscript
}