任意のログをlogrotateを使って管理する

## 概要
アプリケーションのログをsyslogに吐き出し、ローテートする。


## 関連記事
- [Dockerのログをrsyslogで出力する](https://qiita.com/Esfahan/items/5e5a9ae7882bb0eaaf5f)
- [Railsのログをsyslogに出す](http://qiita.com/Esfahan/items/9763e0bc509f75b9d379)
- [PythonでSysLogHandlerを使ってsyslogでログを出力する](https://qiita.com/Esfahan/items/7888914dca0e8d23eac3)

## 環境
- CentOS release 6.7

## 設定ファイル
設定ファイル構成

```bash
/etc/
├── logrotate.conf # メインの設定ファイル
├── logrotate.d # 各サービスごとの設定ファイル
│   ├── dracut
│   ├── iscsiuiolog
│   ├── mcollective
│   ├── mysql
│   ├── syslog
│   ├── yum
```
/etc/logrotate.confに全ての設定を記載することも可能だが、
/etc/logrotate.d以下もincludeされているので、ここにサービスごとの設定ファイルを作成し、記載する。

## 設定例
下記の例を設定する

| 設定内容 | 値 |
| :-- | :-- |
| 対象のログ | /var/log/sample-service/sample.log |
| ローテート期間 | 毎日 |
| 何世代ログを残すか | 10日 |
| postrotate | ローテート後にsyslogを再起動 |

*syslogを再起動しないと、新しいファイルにログが書き込まれない*

### sample-service用の設定ファイルを作成
`$ vi /etc/logrotate.d/sample-service`

```bash:/etc/logrotate.d/sample-service
/var/log/sample-service/sample.log { # 対象のログファイル
    ifempty            # ログファイルが空でもローテーションする
    dateformat .%Y%m%d # dateフォーマットを任意のものに変更する
    missingok          # ログファイルがなくてもエラーを出さない
    compress           # 圧縮する
    daily              # 毎日ローテートする
    rotate 10          # 10世代分古いログを残す
    postrotate         # ローテート後にsyslogを再起動
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
```

### 各種コマンド一覧

| コマンド | 説明 |
| :-- | :-- |
| compress | ローテーションしたログをgzipで圧縮 |
| copytruncate | ログファイルをコピーし、内容を削除 |
| create | [パーミッション ユーザー名 グループ名] ローテーション後に空のログファイルを新規作成。ファイルのパーミッション、ユーザー名、グループ名を指定可能 |
| daily | ログを毎日ローテーションする |
| delaycompress | ログの圧縮作業を次回のローテーション時まで遅らせる。compressと共に指定 |
| ifempty | ログファイルが空でもローテーションする |
| missingok | ログファイルが存在しなくてもエラーを出さずに処理を続行 |
| monthly | ログを毎月ローテーションする |
| nocompress | ローテーションしたログを圧縮しない |
| nocreate | 新たな空のログファイルを作成しない |
| nomissingok | ログファイルが存在しない場合にエラーを出す |
| noolddir | ローテーション対象のログと同じディレクトリにローテーションしたログを格納 |
| notifempty | ログファイルが空ならローテーションしない |
| olddir [ディレクトリ名] | 指定したディレクトリ内にローテーションしたログを格納 |
| postrotate～endscript | postrotateとendscriptの間に記述されたコマンドをログローテーション後に実行 |
| prerotate～endscript | prerotateとendscriptの間に記述されたコマンドをログローテーション前に実行 |
| rotate 回数 | ローテーションする回数を指定 |
| size [ファイルサイズ] | ログファイルが指定したファイルサイズ以上になったらローテーションする |
| sharedscripts | 複数指定したログファイルに対し、postrotateまたはprerotateで記述したコマンドを実行 |
| weekly | ログを毎週ローテーションする |

引用元:http://masasuzu.hatenablog.jp/entry/20111117/1321512757


## ローテート確認
`-d`をつけてdry-runをして結果を見る。

```
# logrotate -dv /etc/logrotate.conf
```

実際に実行するにはこちら

```
# /usr/sbin/logrotate /etc/logrotate.conf
```

ローテートする条件を満たしていなくても強制的に実行する場合は`-f`を付ける

```
# logrotate -f /etc/logrotate.conf
```

最後にローテーションされたログファイルの日付を確認する

```
# cat /var/lib/logrotate.status
…
logrotate state -- version 2
"/var/log/yum.log" 2017-1-13
"/var/log/dracut.log" 2017-1-13
"/var/lib/mysql/mysqld.log" 2017-1-13
(略)
```

以上

## 参考
[logrotate でデフォルト以外のフォーマットで日付ファイル名にしたいとき](http://qiita.com/tbpgr/items/a8499496fca6f5aa958b)
[logrotate.confファイルを読み解くメモ](http://masasuzu.hatenablog.jp/entry/20111117/1321512757)
[rsyslogを利用したログファイル作成と、logrotateを利用したログのローテーション](http://oxynotes.com/?p=6493)
[logrotate（ログローテート）の動作確認](https://open-groove.net/linux/logrotate-test/)