logrotateはとても便利ですが、ローテーションの周期に今まで一番小さい単位でもdaily(日毎)しかありませんでした。
そのため、時間ごとのローテートを行う際にはpostrotateなどでごにょごにょしたり、cronなど設定する必要がありました。。。
/var/log/nginx/*log {
create 0644 nginx nginx
daily
rotate 10
missingok
notifempty
#compress
size 1
nodateext
sharedscripts
postrotate
EXT=`date +%Y%m%d%H%M`
for f in $1
do
ls $f.1 >/dev/null 2>&1
if [ $? -eq 0 ] ; then
mv $f.1 $f.$EXT
gzip $f.$EXT
fi
done
/etc/init.d/nginx reopen_logs
endscript
}
ただし、下記自分のblogにも書いたのですが、logrotate3.8.5以降はhourly(時間ごと)ローテートに対応したので、上記のような事をしなくても時間毎のローテートができるようになったようです!
logrotateでnginxのログを1時間ごとにローテートをする
一度最新のlogorotateを使ってnginxのアクセスログをhourlyローテートするようにしたのでメモ。
結論
- 最新のlogrotateを使えばanacronの設定とlogrotateのローテート設定をhourlyと変更するだけで時間毎のローテートができる
最新のlogrotateをインストールする
自分の試したAmazonLinux(2015.10.09)ではlogrotate3.7.8となっており、hourlyの対応がされていません。。。
なので、rpmbuildコマンドを使って、rpmを作成し、インストールします。
rpmbuildを使う際に必要なものをまとめてインストールします。
$sudo yum groupinstall "Development Tools"
logrotateで必要なパッケージをインストールします。
$sudo yum install popt-devel libselinux-devel
上記を参考にrpmbuildを行うための準備を行います。HOMEディレクトリ配下に必要なディレクトリ群の作成と~/.spmmacros
を作成して、rpmbuild実行時にHOMEディレクトリ配下のディレクトリを使うように指定しています。
手動でやっても良いのですが、rpmdev-setuptree
コマンドを使えばよいらしいのでこれでやります。
$sudo yum install rpmdevtools
$rpmdev-setuptree
ちなみに手動でやる場合、以下のような感じです。(rpmdev-setuptreeを実行していればやる必要なし)
$mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
$echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
準備ができたのでlogrotateのソースコードを取得し、specファイルの配置とソースコードの配置を行う。
# ソースコード取得
$wget https://fedorahosted.org/releases/l/o/logrotate/logrotate-3.9.1.tar.gz
# tarのソースコードをSOURCES配下に配置する必要がる
$cp logrotate-3.9.1.tar.gz rpmbuild/SOURCES/
# 解凍
$tar -zxvf logrotate-3.9.1.tar.gz
# ビルド手順が書かれた、specファイルを配置
$ cp logrotate-3.9.1/logrotate.spec rpmbuild/SPECS
# specファイルに従い、rpmを作成
$rpmbuild -bb rpmbuild/SPECS/logrotate.spec
ビルドが成功すれば~/rpmbuild/RPMS/x86_64
フォルダ配下に以下の2つのrpmが配置されていると思います。(x86_64は実行環境によって変わる)
- logrotate-3.9.1-1.x86_64.rpm
- logrotate-debuginfo-3.9.1-1.x86_64.rpm
生成されたrpmをインストールします。
$cd rpmbuild/RPMS/x86_64/
$sudo rpm -Uvh logrotate-3.9.1-1.x86_64.rpm
$logrotate
logrotate 3.9.1 - Copyright (C) 1995-2001 Red Hat, Inc.
This may be freely redistributed under the terms of the GNU Public License
Usage: logrotate [-dfv?] [-d|--debug] [-f|--force] [-m|--mail command] [-s|--state statefile] [-v|--verbose] [-l|--log STRING] [--version] [-?|--help] [--usage] [OPTION...] <configfile>
無事最新のlogrotateがインストールできました。
nginxのローテートをhourlyにしてみる
早速、nginxのローテートがhourlyになるように変更してみます。
と、その前にanacronで実行されるlogrotateコマンドをdailyでなく、houlryで実行するようにします。
そもそもlogrotateはどうやって動いているのかというとデフォルトでは/etc/cron.daily/フォルダ配下にlogrotateの実行コマンドが記載されたファイルを配置する事で1日で1回のみ実行されるようになっています。せっかく設定でhourlyとしても実行が1日1回ではローテートがうまくいかないのでcron.hourly配下にスクリプトを変更することで1時間毎にlogrotateコマンドが実行されるように変更します。
$sudo mv /etc/cron.daily/logrotate /etc/cron.hourly/
対象ファイルがいつローテートされたかについてはデフォルトであれば/var/lib/logrotate.status
に記憶しており、dailyローテートの設定で1時間毎にlogrotateコマンドが実行されても、不必要にローテートする事はないため、既存のものにも影響しません。
次に対象のnginxのlogrotateのファイルを変更します。
変更点は以下です。rotateは任意の設定で。
- dailyをhourlyに変更(時間ローテート)
- rotateを240に変更(24*10=240で10日分)
/var/log/nginx/*log {
create 0644 nginx nginx
hourly
rotate 240
missingok
notifempty
compress
sharedscripts
postrotate
/etc/init.d/nginx reopen_logs
endscript
}
適当にWebサーバーにアクセス後、1時間程度経過後、確認してみます。
$sudo ls /var/log/nginx/
access.log access.log-2015102003.gz error.log error.log-2015102003.gz
おおー、時間毎のローテートできてるー!manを見る感じhourlyを指定した場合のデフォルトは-%Y%m%d%Hとなっているようです。フォーマットを変えたい場合、dateformatを使えば変更できそうな感じです。
試し以下を追記して-
を_
に変更します。
dateformat _%Y%m%d%H
無事できてます!
$sudo ls /var/log/nginx/
access.log access.log-2015102003.gz access.log_2015102004.gz access.log_2015102005.gz error.log error.log-2015102003.gz
[おまけ]logrotateをビルドしてみる
rpm作成でなく、ビルドは以下で可能です。
$git cloen https://github.com/logrotate/logrotate.git
$cd logrotate
$./autogen.sh
$./configure
$make
$sudo make install