Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 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
toshihirock
こちらは個人の意見で会社とは関係ありません。お約束です。
http://toshihirock.blogspot.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away