logrotate と cron を利用し、ずっとサイズが増えていくログファイルのローテーションする方法

目次

1. 構築要件

/opt/aem/author/crx-quickstart/logs 配下のログファイル stdout.log がずっとサイズが増えていくため、定期的にログローテーションする方法を紹介します。

image.png

  • 実行頻度:毎日 02:00 に実行します。
  • 実行内容(その1):ログファイルを前日の日付付けてリネームします。(例:stdout.log ⇒ stdout.log.2020-09-10 ※現在日付:2020-09-11)
  • 実行内容(その2):7日前のログファイルを削除します。(常に7世代(7日)分のログファイルを残す)
2. logrotate と cron のインストール
2.1 logrotate のインストール
  • logrotate のインストールを確認します。
$ yum list installed | grep logrotate
logrotate.x86_64                      3.8.6-15.amzn2                 installed
  • logrotate がインストールされていない場合は、インストールします。
$ yum install -y logrotate
2.2 cron のインストール
  • cron のインストールを確認します。
$ yum list installed | grep cron
cronie.x86_64                         1.4.11-23.amzn2                installed
cronie-anacron.x86_64                 1.4.11-23.amzn2                installed
crontabs.noarch                       1.11-6.20121102git.amzn2       installed
  • cronインストールされていない場合は、インストールします。
$ yum install -y cron
  • cronサービスの起動状態確認
$ systemctl status crond.service
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2020-06-17 18:04:31 JST; 2 months 21 days ago
 Main PID: 2476 (crond)
   CGroup: /system.slice/crond.service
           mq2476 /usr/sbin/crond -n
  • cronサービスが起動開始していない場合、起動します。
$ systemctl start crond.service
3. cron ジョブで logrotate の実行設定

CentOS7では、指定する日時に cron ジョブを実行するため、crontab の設定ファイル「etc/crontab」の最後に、行を追記します。

3.1 crontab の設定
$ vi /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
# Run every day at 02:00
0 2 * * * root run-parts /etc/cron.weekly

#  ↑ 毎日02:00に、/etc/cron.weeklyフォルダのlogrotateを実行します。
3.2 /etc/cron.weekly の設定
  • /etc/cron.dailyフォルダ から logrotateファイル を /etc/cron.weekly フォルダにコピーします。
$ cp /etc/cron.daily/logrotate /etc/cron.weekly/
$ ls -l /etc/cron.weekly
-rwx------ 1 root root 222 Sep  7 15:30 logrotate
  • logrotateファイルの中身は下記のように編集します。
$ vi /etc/cron.weekly/logrotate
#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status -f /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
3.3 ログローテーションの設定ファイル /etc/logrotate.conf の設定
  • バックアップしてから、中身を下記のように編集します。
$ cp /etc/logrotate.conf /etc/logrotate.conf.bk
$ vi /etc/logrotate.conf
# see "man logrotate" for details

# 設定された世代分のログを保管します。
/opt/aem/author/crx-quickstart/logs/stdout.log {
    daily
    missingok
    nocompress
    create 0644 aem-user aem-group
    ifempty
    rotate 7
    dateext
    dateyesterday
    dateformat .%Y-%m-%d
    su aem-user aem-group
}

# system-specific logs may be also be configured here.
3.4 cronサービスの再起動
$ systemctl restart crond.service
# 再びcronの動作確認
$ systemctl status crond.service

ここまで、ログローテーションの設定が全て完了。

4.ログローテーションの動作確認
  • cronログからcronジョブが正常に稼働することを確認します。
$ tail -f /var/log/cron
  • ローテーション情報から確認します。
$ cat /var/lib/logrotate/logrotate.status
logrotate state -- version 2
"/plus/author/crx-quickstart/logs/stdout.log" 2020-9-11-18:9:48

7日後、毎日ログローテーション実施により、対象フォルダに下記のファイルが残っています。

image.png