今号では、Linux におけるログローテーションの仕組みについて説明します!
ログローテーションとは
ログローテーションとは、ログファイルが肥大化するのを防ぐために、定期的に古いログをアーカイブ (圧縮) したり、削除する仕組みです。
Linux では logrotate というツールが主に使用されています。
このプロセスが systemd のタイマー機能により実行されることで、ログ管理を行なっています。
RHEL9 の場合、主に /var/log 配下の各ログファイルがローテート対象になっており、下記の様に古いファイルは番号付きで圧縮されます。
# ls -l /var/log/ … -rw-------. 1 root root 0 Jan 9 19:43 maillog -rw-------. 1 root root 0 Nov 27 00:58 maillog-20241213 -rw-------. 1 root root 0 Dec 13 19:56 maillog-20241225 -rw-------. 1 root root 156523 Dec 27 01:59 maillog-20250101 -rw-------. 1 root root 107334 Jan 7 02:35 maillog-20250109 -rw-------. 1 root root 1396633 Jan 12 20:55 messages -rw-------. 1 root root 390128 Nov 27 11:00 messages-20241213 -rw-------. 1 root root 97309 Dec 13 19:58 messages-20241225 -rw-------. 1 root root 1143833 Dec 27 10:59 messages-20250101 -rw-------. 1 root root 879657 Jan 7 11:00 messages-20250109 …
※ファイル数が多いため、該当する箇所を一部抜粋しています。
ログローテーションの設定ファイル
logrotate 全体の動作は /etc/logrotate.conf で、ログ個別の動作は /etc/logrotate.d 配下の各ファイルで設定します。
まずは logrotate.conf の内容を見てみます。
# see "man logrotate" for details # global options do not affect preceding include directives # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # use date as a suffix of the rotated file dateext # uncomment this if you want your log files compressed #compress # packages drop log rotation information into this directory include /etc/logrotate.d # system-specific logs may be also be configured here.
各設定の意味について、それぞれ解説します。
- weekly
ログファイルを週次 (週1回) ローテートします。ローテートが実行されると、ログファイルは新しいものに入れ替えられます。 - rotate 4
4世代分のファイルを保存します。5ファイル目以降は、古い順に削除されます。 - create
古いログファイルをローテートした後に、新しいログファイルを作成します。その後は新しいログファイルに書き込まれるようなります。 - dateext
ローテートしたログファイルの末尾に日付を付けます。 - #compress
ログファイルを圧縮する場合は、この行のコメントをします。デフォルトでは圧縮しないようになっています。 - include /etc/logrotate.d
/etc/logrotate.d 内の設定ファイルを読み込みます。
/etc/logrotate.conf の設定は、このディレクトリ内の設定ファイルで上書きされます。
次に、/etc/logrotate.d 配下の各設定ファイルは、デフォルトでは下記の様になっています。
新たにソフトウェアをインストールすると、このディレクトリに新たなファイルが作成される場合があります。
# ls -l /etc/logrotate.d total 36 -rw-r--r--. 1 root root 130 Oct 14 2019 btmp -rw-r--r--. 1 root root 160 Aug 29 2022 chrony -rw-r--r--. 1 root root 88 Sep 9 2022 dnf -rw-r--r--. 1 root root 105 Sep 20 2023 insights-client -rw-r--r--. 1 root root 162 Jan 3 2024 kvm_stat -rw-r--r--. 1 root root 226 Jul 31 2023 rsyslog -rw-r--r--. 1 root root 237 Jan 10 2024 sssd -rw-r--r--. 1 root root 88 Sep 14 2023 subscription-manager -rw-r--r--. 1 root root 145 Oct 14 2019 wtmp
では、デフォルトで用意されている /etc/logrotate.d/rsyslog の内容を見てみます。
/var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler { missingok sharedscripts postrotate /usr/bin/systemctl -s HUP kill rsyslog.service >/dev/null 2>&1 || true endscript }
各設定の意味について、それぞれ解説します。
- /var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
対象となるログファイルのパスを指定します。このように、複数のパスを記載することができます。 - missingok
ログファイルがなくてもエラーにしません。 - sharedscripts ~ endscript
sharedscripts ~ endscript の間に記載されたスクリプトを (ローテートされる毎に) 1度だけ実行します。 - postrotate
ログのローテーション後にスクリプトを実行することを示します。 - /usr/bin/systemctl -s HUP kill rsyslog.service >/dev/null 2>&1 || true
rsyslog を再起動するスクリプトです。
systemd のタイマー機能によるログローテーションの定期実行
上記で説明した設定ファイルのみでは、ログローテーションが自動で実行されることはありません。
RHEL9 の場合、ログローテーションは systemd が logrotate を起動することで実施されます。
なお、RHEL7 までは cron を用いて起動していました。
デフォルトでは /usr/lib/systemd/system/logrotate.timer ファイルにてタイマーの設定がされており、このうち OnCalendar=daily (日次で実行) の設定に従って、logrotate (logrotate.service) が 1日 1回起動されます。
[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
logrotate が起動されると、上記で説明した設定ファイルを読み込み、その内容に応じてログの圧縮や削除などを行う仕組みとなっています。
次号では、ログローテーションの設定について、もう少し詳しく見ていきます!