Red Hat Enterprise Linux 8でlogrotateを使ってログファイルを1時間ごとにローテーションさせてみた

Red Hat Enterprise Linux 8以前のlogrotateはsystemd-timerではなく、cronで起動しています。
2023.09.11

こんにちは!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内のlogrotatecron.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では正常にローテーションされること。
  • 自動ローテーションの場合、日次でのローテーションは実行されている。

原因

原因はlogrotatecron.dailyにあるためでした。
そのためlogrotateは日次でしかローテーションされることが初期設定となっています。

対処方法

cron.daily内のlogrotatecron.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

最新のlogrotateを使って簡単に時間毎(hourly)のログローテートをしよう! - Qiita

logrotateでnginxのログを1時間ごとにローテートをする