Logrotate の正体はコマンドと cron
ログローテートとは、ログファイルのサイズが大きくならないように、1 日、または 1 週、または 1 か月といった期間でファイル名を変更し、設定次第では古いファイルを gzip で圧縮したり、もっと古いファイルを削除したりすることができる仕組みのことです。
Logrotate はデーモンとして動作していると勘違いされることも多いようですが、その実体は /usr/sbin/logrotate というコマンドと cron.daily の組合せです。つまり、crond によってlogrotate コマンドが毎日実行されているのです。
Logrotate の Status
なお、以下の cron 設定を見れば分かる通り、logrotate コマンドには引数として『前回の実行時刻』を保存した logrotate.status と『設定ファイル』である logrotate.conf が渡された上で実行されます。(ただし、-sを付けないときはデフォルトで /var/lib/logrotate/logrotate.status から前回実行時刻を参照するので、この場合は付けなくても結果は変わりません)
[root@localhost log]# cat /etc/cron.daily/logrotate #!/bin/sh /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0 [root@localhost log]#
設定反映や再起動の仕方、手動実行、デバッグ
前述の通り、夜な夜な crond が logrotate コマンド (引数に logrotate.conf を指定) を実行するため、conf ファイルを設定変更さえすれば反映されます。サービス再起動は不要です。
ですが logrotate の実行時間は主に 3 時 5 分 ~ 3 時 50 分ですので、動作確認はその時間まで待たなければなりません。(実行時間については /etc/anacrontab に設定があります)
cron 以外にすぐに動作確認するには logrotate コマンドを手動実行すればOKです。手動実行には -f オプションを使います。-v と併せて使えば実行プロセスと実行結果を表示してくれます。
# logrotate -fv /etc/logrotate.conf
-d を付ければデバッグモードで動作します。デバッグモードでは、ログをローテートすることなく空運転で実行プロセスと実行結果を表示します (-v は不要)。
# logrotate -d /etc/logrotate.conf
log does not need rotating (log has been rotated at 2018-8-15 18:21, that is not week ago yet) 等と表示された場合は時間経過が足りずローテートされないことを示しています。
この場合、状態ファイルである /var/lib/logrotate/logrotate.status を vi 等で直接編集し、最後に実行された日時を rotate 間隔よりも前にして再実行してみましょう。
confファイルの書式(オプション/Directive)一覧
/etc/logrotate.conf および /etc/logrotate.d/*.conf の書式で使うオプション (Directive) を以下に示します。なお、/etc/logrotate.d/*.conf に記載がない項目については /etc/logrotate.conf に global 設定があればその設定を引用しますが、以下コマンドのように個別実行する場合はこの global 設定が引き継がれないので注意が必要です。特に rotate を含めていないと rotate 0 と解釈され、過去ログが消えてしまいます。
rotate [count]
[count] の世代数のログファイルを確保し、それより古いログファイルを削除します。この記載が無い場合は rotate 0 と解釈され、古いログを全て削除してしまいます。
compress
古いログファイルを gzip で圧縮します。圧縮したくない場合は nocompress を指定します。
copytruncate
更新中のログファイルを別名に mv するのではなく、cp した後に更新中のログファイルを空にします。
これはログファイルを Open し続ける (i-node 番号の変化に対応できない) アプリケーションで効果的ですが、cp してから空にするまでの間に書き込まれたログは失われてしまいます。これが指定された場合は create は無視されます。
create { mode owner group | owner group }
ローテーションで更新中のログファイルを古いログファイルにリネーム (mv) した後に、すぐに同じ名前のファイルを作ります。
i-node が変わるため、アプリケーションによってはこの対応では NG で、copytruncate を使う必要があります。
パーミッション (mode) や所有者 (owner)、所有グループ (group) も指定できます。同じ名前のファイルを作らない場合は代わりに nocreate を指定します。
daily or weekly or monthly or yearly
daily と指定すれば、毎日ローテートを行います。weekly は毎週、monthly は毎月 1 回ローテートします。hourly も指定できますが、その場合はデフォルトの cron.daily ではなく cron.hourly で logrotate を動作させる必要があります。
dateext
古いログファイルにリネームするときの suffix を日付 8 桁 (-YYYYMMDD) にします。
ifempty
空ファイルをローテートします。空ファイルをローテートさせたくない場合は notifempty を指定します。
maxage [count]
[count] で指定した日数分のログを確保し、それより古いログファイルを削除します。
size [size]
更新中ログファイルが [size] で指定した Byte 数を超えた場合にローテートします。この設定をした場合、daily , weekly , monthly 等のインターバル設定は無効とみなします。
maxsize [size]
更新中ログファイルが [size] で指定した Byte 数を超えた場合にローテートします。daily , weelky , monthly 等のインターバル内であってもローテートします。
minsize [size]
更新中ログファイルが [size] で指定した Byte 数を超えた場合にローテートします。ただし、daily , weelky , monthly 等のインターバル内の場合はローテートしません。
missingok
ログファイルが無くてもエラー扱いしません。エラー扱いしたい場合 (create や copytruncate を指定している場合) は nomissingok を指定します。
olddir [directory]
古いログファイルを [directory] に移動します。移動先は同じデバイスである必要があります。
prerotate /endscript
postrotate と endscript の間にあるスクリプトを、ローテート前に実行します。
postrotate / endscript
postrotate と endscript の間にあるスクリプトを、ローテート後に実行します。
sharedscripts
対象ログファイルが * や複数指定されている場合、このオプションが無いと各ログ毎にスクリプトを実行します。このオプションを指定していれば、対象ログファイル複数に対して、共通して 1 回だけ実行するようになります。
例えば /etc/logrotate.d/chrony では対象ファイルを /var/log/chrony/*.log と指定しており、"log measurements statistics tracking" を指定している場合は measurements.log と statistics.log と tracking.log の 3 つのログファイルが生成されます。
sharedscripts を指定することで、この 3 つのローテートを行う際に prerotate であれば事前に 1 回だけ、postrotate であれば 3 つ完了後に 1 回だけ実行します。
コメント