Posted at

最新のlogrotateを使って簡単に時間毎(hourly)のログローテートをしよう!

More than 3 years have passed since last update.

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ことはじめ

上記を参考にrpmbuildを行うための準備を行います。HOMEディレクトリ配下に必要なディレクトリ群の作成と~/.spmmacrosを作成して、rpmbuild実行時にHOMEディレクトリ配下のディレクトリを使うように指定しています。

手動でやっても良いのですが、rpmdev-setuptreeコマンドを使えばよいらしいのでこれでやります。

おまえら 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日分)


/etc/logrotate.d/nginx

/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を使えば変更できそうな感じです。

試し以下を追記して-_に変更します。


/etc/logrotate.d/nginx

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