知っておくとちょっと便利!logrotate の仕組みについて1

今号では、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 が起動されると、上記で説明した設定ファイルを読み込み、その内容に応じてログの圧縮や削除などを行う仕組みとなっています。

次号では、ログローテーションの設定について、もう少し詳しく見ていきます!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です