こんにちは!AWS事業本部のおつまみです。
みなさん、 Red Hat Enterprise Linux8 で logrotate を使って、ログファイルを1時間ごとにローテーションさせたいと思ったことはありますか?私はあります。
logrotate は、ログファイルをローテーションし、必要に応じて圧縮などを行うツールです。
先日こちらの記事でRed Hat Enterprise Linux9 で同様なことができないか調査しました。
この記事の中で、以下のように記載しています。
Red Hat Enterprise Linux 9 以降はsystemd-timerを使い、logrotateが行われるようになっていました。
ということは、Red Hat Enterprise Linux 9 以前のバージョンではcronで動いているんじゃないかなと気になったので確認してみました。
いきなり結論
- Red Hat Enterprise Linux 8 の logrotate は
systemd-timer
ではなく、cron
で起動している。 - デフォルトでは、 logrotate は日次で起動するようになっている。
- 1時間ごとにローテションさせるには、
cron.daily
内のlogrotate
をcron.hourly
に移動させる必要がある。
検証環境
- Red Hat Enterprise Linux 8 (HVM), SSD Volume Type
環境の確認
まず、systemd-timer
で動いていないことを確認するために、設定ファイル/usr/lib/systemd/system/logrotate.timer
があるか確認します。
ll /usr/lib/systemd/system/*.timer
-rw-r--r--. 1 root root 138 Jul 14 2022 /usr/lib/systemd/system/chrony-dnssrv@.timer
-rw-r--r--. 1 root root 320 Apr 12 2021 /usr/lib/systemd/system/dnf-makecache.timer
-rw-r--r--. 1 root root 229 Apr 3 09:55 /usr/lib/systemd/system/fstrim.timer
-rw-r--r--. 1 root root 696 Mar 2 2021 /usr/lib/systemd/system/insights-client.timer
-rw-r--r--. 1 root root 130 Oct 10 2022 /usr/lib/systemd/system/nm-cloud-setup.timer
-rw-r--r--. 1 root root 490 Jun 22 2018 /usr/lib/systemd/system/systemd-tmpfiles-clean.timer
-rw-r--r--. 1 root root 346 Nov 9 2022 /usr/lib/systemd/system/unbound-anchor.timer
logrotate.timer
が見当たらないですね。
次にcron下を確認してみます。
ls /etc/cron*
/etc/cron.deny /etc/crontab
/etc/cron.d:
0hourly
/etc/cron.daily:
logrotate update-client-config-packages
/etc/cron.hourly:
0anacron
/etc/cron.monthly:
/etc/cron.weekly:
cron.daily
内にlogrotate
がありました!
このことからRed Hat Enterprise Linux 8 の logrotate はsystemd-timer
ではなく、cron
で起動していることがわかりますね。
この状態でlogrotate.d下にある設定ファイル/etc/logrotate.conf
と/etc/logrotate.d/tomcat
を以下のように設定しました。
/etc/logrotate.conf
# see "man logrotate" for details
# 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
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# system-specific logs may be also be configured here.
/etc/logrotate.d/tomcat
/var/log/tomcat/catalina.out
{
hourly
missingok
rotate 24
ifempty
dateext
compress
}
※ 今回は検証のため、catalina.out
のみローテーションさせるように設定しています。
各パラメータの詳細について知りたい方はこちらの記事がわかりやすいので、ご参考ください。
ログローテートソフトウエア logrotate についてまとめ - Qiita
/etc/logrotate.d/tomcat
内でhourly
で設定したため、1時間ごとにローテーションされるかなと思いきや、いつまで経ってもローテーションされませんでした。
ちなみにlogrotateは設定ファイルを変更しても、再起動などは不要です。
なお以下は確認済でした。
- デバックモードでの起動
logrotate -dv /etc/logrotate.d/tomcat
でerrorが出ないこと。 - 手動での強制ローテーション
logrotate -f /etc/logrotate.d/tomcat
では正常にローテーションされること。 - 自動ローテーションの場合、日次でのローテーションは実行されている。
原因
原因はlogrotate
がcron.daily
にあるためでした。
そのためlogrotateは日次でしかローテーションされることが初期設定となっています。
対処方法
cron.daily
内のlogrotate
をcron.hourly
に移動させ、cronを再起動させます。
以下のコマンドをroot権限、もしくはsudo
をつけて実行するだけです。
cp /etc/cron.daily/logrotate /etc/cron.hourly/
このまま1時間程度経過後、確認してみます。
ll /var/log/tomcat/catalina.out*
-rw-r--r--. 1 root root 0 Sep 11 02:01 catalina.out
-rw-r--r--. 1 root root 845 Sep 11 01:34 catalina.out-2023091101.gz
ローテーションされていることが確認できました!
なおcronはサーバの停止中、タスクを実行しません。
そのため、指定した時刻に実行できなかった場合、次回の指定時刻まで待つ必要があります。
systemd-timer
との違いになるので、注意してください。
さいごに
今回はRed Hat Enterprise Linux 8 で logrotateを使ってログファイルを1時間ごとにローテーションさせる方法をお伝えしました。
今回の検証からRed Hat Enterprise Linux 8 以前 → 9に移行した場合にlogrotateの扱い方に注意しなければいけないことがわかりました。
どなたかのお役に立てれば幸いです。 最後までお読みいただきありがとうございました!
以上、おつまみ(@AWS11077)でした!
参考資料
ログローテートソフトウエア logrotate についてまとめ - Qiita
第27章 システムタスクの自動化 Red Hat Enterprise Linux 6 | Red Hat Customer Portal