KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

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
}