Linuxではlogrotateコマンドでログの切り替えを行うことができますが、ログ切り替えの最小単位は1時間周期(hourly)です。
今回は、logrotateコマンドで、15分おきや1分おきなど、1時間より短い時間でのログ切り替えを行う方法を説明します。
作業の手順
まずは、動作確認のために、適当にログファイルを作ります。(ファイル名やパスは何でも良いですが、今回は/var/log/app/application.logにログがあるものとして説明します)
echo test >> /var/log/app/application.log
echo test >> /var/log/app/application.log
ローテーションの定義を作成します。ここで通常ならdailyとかhoulyなどローテーションタイミングの指定を行うのですが、今回はタイミングの指定を行いません。
※ちなみに、loglotateにはminuteの定義はないので、指定自体が行えません。
# /etc/logrotate_minute.conf
/var/log/app/application.log {
su root syslog
missingok
rotate 120
create 0644 apache apache
notifempty
}
次に、先ほど作成したconfigを使って手動でローテーションを行ってみます。
/usr/sbin/logrotate -f /etc/logrotate_minute.conf
ここでのポイントは、-f
オプションを指定していることで、-f
をつけると"daily"や"hourly"などの期間指定の定義を無視して、コマンドの実行時にログのローテーションが実行される事です。
コマンドを実行したら、実際にログファイルがローテーションされたことを確認します。
ls -l /var/log/app/
application.log
application.log.1
手動での実行がうまくいくことを確認したら、cronのジョブに登録して自動化します。
下記の例では、先ほどのコマンドを毎分実行する事になります。
sudo crontab -e
* * * * * /usr/sbin/logrotate -f /etc/logrotate_minute.conf > /var/log/logrotate_log.txt 2>&1
※上記の例では、> /var/log/logrotate_log.txt 2>&1
で、cronの実行結果をロギングしていますが不要なら消しても良いです。
毎分ではなく、15分おきに実行したければ下記のようにします。実行タイミングの制御はcrontabの定義の仕方を参考にするとよいです。
sudo crontab -e
*/15 * * * * /usr/sbin/logrotate -f /etc/logrotate_minute.conf > /var/log/logrotate_log.txt 2>&1
これで、1時間未満の任意の周期でログのローテーションが行えるようになりました。
補足1:logrotateの実行ステータスを確認する
logrotateコマンドが最後に処理を実行した時刻は、下記のコマンドで確認できます。
more /var/lib/logrotate/status | grep "application\.log"
"/var/log/app/application.log" 2017-9-12-5:46:1
補足2: 通常のlogrotateの定義方法
今回の説明とは直接関係ないですが、1日毎でのローテーションなど、デフォルトでのlogrotateコマンドの定義は以下のような形になっています。(今回はubuntu-trustyでの実装を確認しています)
logrotateコマンドでは設定内容を、/etc/logrotate.confに定義するのがデフォルトとなっています。
ubuntu-trusty-64で、上記のconfファイルはcron.dailyで定義しています。このコマンドは、/etc/cron.daily/フォルダにあることからも分かるりますが、cronで毎日周期的に実行されています。
#/etc/cron.daily/logrotate
#!/bin/sh
# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
[ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf
設定ファイルである/etc/logrotate.confの中身を見ると以下のようになっています。特に注意する点は、ファイル内にあるinclude定義を利用していて/etc/logrotate.d/*
にあるconfファイル定義をすべて読み込んでいる事です。定義をlogrotate.confに追記せず、プログラムごとにconfを分ける理由は、yumやapt-getなどのパッケージ管理ツールがファイルの管理を容易にするためです。
# see "man logrotate" for details
# rotate log files weekly
weekly
# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 1
}
/etc/logrotate.d/*の中には複数のファイルがありますが、例えば/etc/logrotate.d/aptitudeを見ると以下のような定義となっています。
# /etc/logrotate.d/aptitude
/var/log/aptitude {
rotate 6
monthly
compress
missingok
notifempty
}
補足3: logrotateの実行の仕組み
logrotateコマンドは、UbuntuやCentOSの場合デフォルトでインストールされています。
logrotateコマンドは常駐プログラムではなく、実行するたびにconfファイルの内容を元に、ログのローテーション処理が実行されます。
このため、logrotateコマンドを一定周期ごとに呼び出す必要があり、通常はcrontabに登録する使い方が一般的です。