Linux(CentOS7)ログローテーションのタイミング(主に初回ローテーションの動作について)
Linux(CentOS7)でのログローテーションのタイミング、特に初回ローテーションの動作にフォーカスして書かせて頂きます。
ログローテションの実行周期設定
ログローテーション実行周期設定ファイル
ログローテーションの実行周期は、/etc/cron.d/dailyjobs
で定義しています。これを編集すれば、任意の時間にログローテーションが可能となります。以下はデフォルト設定ですが、日次のローテションは、04:02に実行される設定です。
# Run the daily, weekly, and monthly jobs if cronie-anacron is not installed
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# run-parts
2 4 * * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.daily
22 4 * * 0 root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.weekly
42 4 1 * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.monthly
noanacronインストール、anacronアンインストール
しかし、CentOS7では、「noanacron」をインストールし、「anacron」をインストールすることで初めて/etc/cron.d/dailyjobs
の設定が有効になります。理由などは割愛しますがコマンドだけ記載します。インストール、アンインストールの順序にも意味がありますのでご注意ください。
yum install cronie-noanacron #「cronie-noanacron」のインストール
yum remove cronie-anacron #「cronie-anacron」のアンインストール
ログローテーション対象ファイル追加
ログローテーション対象ファイルは/etc/logrotate.d/
ディレクトリ配下のファイルで指定しています。
ログローテーション対象ファイルを追加する場合は、/etc/logrotate.d/
ディレクトリ配下の既存ファイルに追記するか、新しい設定ファイルを作成し、そこに記載します。
以下の例では、設定ファイル/etc/logrotate.d/example
を作成し、ログローテーション対象ファイルとして/var/log/example_access.log
と/var/log/example_error.log
を追加しました。
/var/log/example_access.log
/var/log/example_error.log
{
missingok
sharedscripts
dateext
daily
rotate 35
ifempty
compress
delaycompress
}
初回ログローテションの動き
これで、先ほど設定した/var/log/example_access.log
と/var/log/example_error.log
が04:02にローテーションされるかというと、そうではありません。実際にローテーションされるのは、2日後の04:02となります。
これはログローテーションが/var/lib/logrotate.status
に記載されている前回のローテーション日時を確認しているからです。このファイルには、"ファイル名" "前回のローテーション日時"
が一行ずつ記載されています。
logrotate state -- version 2
"/var/log/yum.log" 2018-8-30-15:0:0
"/var/log/chrony/*.log" 2018-8-30-15:0:0
"/var/log/wtmp" 2018-8-30-15:0:0
"/var/log/waagent.log" 2018-10-2-12:2:1
"/var/log/spooler" 2018-10-12-19:34:1
"/var/log/btmp" 2018-10-2-12:2:1
"/var/log/maillog" 2018-10-12-19:34:1
"/var/log/wpa_supplicant.log" 2018-8-30-15:0:0
"/var/log/secure" 2018-10-12-19:34:1
"/var/log/ppp/connect-errors" 2018-8-30-15:0:0
"/var/log/messages" 2018-10-12-19:34:1
"/var/account/pacct" 2018-8-30-15:0:0
"/var/log/cron" 2018-10-12-19:34:1
初回ログローテーションのシミュレーション
初回ログローテーションを時系列でシミュレーションしてみます。ログローテーション対象ファイル設定を追加した日時を2018/10/12 12:00
と仮定してください。ログローテション周期は、日次 04:02
で設定しています。
0日目(2018/10/12 12:00 設定直後)
設定直後は、/var/lib/logrotate.status
にはログローテーション対象ファイルの記載はありません
(/var/log/example_access.log、/var/log/example_error.logの記載はない)
1日目(2018/10/13 04:02)
設定後、初めてのログローテーション設定時刻を迎えますが、ここでは/var/lib/logrotate.status
にファイル名と日時を追記するのみです。日時はcronの設定時刻04:02とは関係なく、0:0:0(0時0分0秒)となります。
"/var/log/example_access.log" 2018-10-13-0:0:0
"/var/log/example_error.log" 2018-10-13-0:0:0
2日目(2018/10/14 04:02)
2回目のログローテーション設定時刻では、/var/lib/logrotate.status
にファイル名と前回のローテーション時刻の記載があり、前回のローテーションから1日以上たっているため、初めてローテションが行われます。
"/var/log/example_access.log" 2018-10-14-4:2:1
"/var/log/example_error.log" 2018-10-14-4:2:1
-rw-r--r-- 1 root root 373 10月 14 02:10 example_access.log
-rw-r--r-- 1 root root 399 10月 13 02:10 example_access.log-20181014
-rw-r--r-- 1 root root 1062 10月 14 01:05 example_error.log
-rw-r--r-- 1 root root 3200 10月 13 01:05 example_error.log-20181014
あとがき
ログローテーションの設定をして、さあテストということで、夜間サーバを起動したままにし、翌日確認すると、ローテーションされていない。ログローテーションごときと思っていたら、ハマってしまったのでこの記事を書かせて頂きました。テスト期間が限られていると場合も多いと思いますのでお気をつけください。