はじめに
今回はLinux(CentOS8)でログローテーションを設定する方法を説明します。
ログローテーションって?
例えば、監視対象から監視サーバー(またはログサーバー)へのログ転送の設定をして、ログ監視をするという話はよくあります。しかし、ログを無事に取得できるようになったので「もうこれで安心♪」というわけではないのです。
取得したログは当然勝手に消えてくれないので(勝手に消えるのも困りますが)、このまま放っておくとログは指定したファイルに溜まり続けます。いきなりストレージを圧迫するなんてことはありませんが、じわじわと容量が増え続けます。たとえシステム全体の容量に問題がなくても、ファイル自体の容量が大きくなりすぎると、ファイルを開くために時間がかかってしまうなんてことも起こります。
cronやmessagessといったログファイルは、デフォルトで設定されているログファイルです。デフォルトで設定されているログファイルを見てみると、すでに定期的にログを保管し、一定期間保管すると削除する設定がされていることが多いです。一定期間ためたログをルールに従って保存・破棄をすることを「ログローテーション」と言います。自分でログ転送を設定した際には、是非ログローテーションの設定もセットで実行しましょう。
知らないと設定時にハマる?
私自身がハマっただけですが…ログローテーションは「設定ファイルを更新した→すぐにファイルがルール通り作られる」というわけではない!ということです。
今回は、ログローテーションの設定ファイルの例から設定方法を実際に検証した結果と共に紹介したいと思います。
検証
検証環境
設定するOSはCentOS8を使用しています。今回はsyslogのファイルをログローテーションさせるので、転送元が存在しますが、ログローテションの設定には関係ないので、割愛します。
検証する2つのファイル
今回ログローテーションするファイルは以下の2つです。
- /var/log/logtest/rt01 …既にログローテーションされているログファイル
- /var/log/logtest/testlog …今回の検証ではじめてログローテーションされるファイル
/var/log/logtest/rt01はすでに/etc/logrotate.d/syslog(ログローテーションの設定ファイル)に記載されているファイルで、すでにログローテーションが実行されているファイルです。
一方の/var/log/logtest/testlogは、今回の検証のために初めてログローテーションに登録します。
ログローテーションは「すでにログローテーションされているファイル」と「初めてログローテションに設定させたファイル 」では、ログローテーションが実行された際の結果が変わります。この辺りを理解していないと混乱しますので、是非とも検証した結果をみていただきたいと思います。
既存のログローテーション設定を確認
設定ファイルを見る
まずは、現状の設定を見ます。ログローテーションしたいファイルの指定やログローテーションの設定ファイルは、ログローテーション全体に反映させる/etc/logrotate.confという設定ファイルと、各ファイルごとに設定できる/etc/logrotate.d配下の設定ファイルがあります。今回は/etc/logrotate.d配下にあるファイルで設定をして行きます。設定ファイルは種類分けされているおり、cronで/etc/logrotate.d配下の設定ファイルを1つずつ参照してログローテーションを実行していきます。
今回はsyslogに関するログをログローテションを設定するので、/etc/logrotate.d/syslogを見てみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@localhost ~]# cat /etc/logrotate.d/syslog /var/log/logtest/rt01 { missingok daily ifempty rotate 10 sharedscripts postrotate /usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true endscript } |
/var/log/logtest/testlogについては、まだ記述がありません。/var/log/logtest/testlogは設定を確認した後、追加します。
設定ファイルの書式について
上記の通り、設定ファイルには「missingok」や「daily」といった単語を記述します。これらの意味については、別でまとめているのでこちらを参考にしてみてください。
上記の「daily」によって、1日おきにログを再生成する設定になっています。
crontabに記述 ※検証のために設定
次にクーロンの設定をします。/etc/cron.daily配下のファイルを毎日12時15分に実行するようにします。
見出しにも書いてありますが、この設定は検証を見やすくするためなので、本来は不必要な設定です。環境にもよりますが、少なからずCentOS8のデフォルト設定ではanacronによって実行されるように設定されています。今回は明示的に実行される時間を設定したいので、crontabに記載します。
以下のようにcrontabを書き換えます。毎日12時15分に実行させる設定を入れます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[root@localhost ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 15 12 * * * root run-parts /etc/cron.daily |
繰り返しになりますが、「run-parts /etc/cron.daily」という記載については、CentOS8のデフォルトの設定ではanacronで行う設定になっています。この検証が終わったら、この設定は消します。
…とはいえ、個人的な話ではありますが以前業務で扱ったLinuxOSはバージョンが古く、crontabに /etc/cron.dailyや /etc/cron.monthが書かれていました(まだまだあるのかな?)。
さっきから何回も出てくるanacronって何?という方は、次の記事を参考にしてみてください。