[Linux]logrotateで毎分rotationする(もしくはN分毎に実行)方法

カテゴリ: Linux | タグ:

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に登録する使い方が一般的です。

こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。