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

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時間ごとにローテートをする](http://toshihirock.blogspot.jp/2015/01/logrotatenginx.html)


一度最新のlogorotateを使ってnginxのアクセスログをhourlyローテートするようにしたのでメモ。

# 結論

+ 最新のlogrotateを使えばanacronの設定とlogrotateのローテート設定をhourlyと変更するだけで時間毎のローテートができる


# 最新のlogrotateをインストールする

自分の試したAmazonLinux(2015.10.09)ではlogrotate3.7.8となっており、hourlyの対応がされていません。。。

なので、rpmbuildコマンドを使って、rpmを作成し、インストールします。

rpmbuildを使う際に必要なものをまとめてインストールします。

```bash
$sudo yum groupinstall "Development Tools"
```

logrotateで必要なパッケージをインストールします。

```bash
$sudo yum install popt-devel libselinux-devel
``` 

[いまさら聞けないrpmbuildことはじめ](http://blog.tnmt.info/2011/04/29/rpmbuild-for-beginner/)

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

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

[おまえら rpmdev-setuptree を使えという話](http://blog.gachapin-sensei.com/blog-entry-1282.html)

```bash
$sudo yum install rpmdevtools
$rpmdev-setuptree
```

ちなみに手動でやる場合、以下のような感じです。(rpmdev-setuptreeを実行していればやる必要なし）

```bash
$mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}  
$echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros  
```

準備ができたのでlogrotateのソースコードを取得し、specファイルの配置とソースコードの配置を行う。

```bash
# ソースコード取得
$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をインストールします。

```bash
$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時間程度経過後、確認してみます。

```bash
$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
```

無事できてます！

```bash
$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
```