Linux
CentOS
log

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

More than 1 year has passed since last update.

概要

railsアプリケーションのログをsyslogに吐き出し、ローテートしたかったのでその時のメモ。

関連記事: Railsのログをsyslogに出す

環境

  • CentOS release 6.7

設定ファイル

設定ファイル構成

/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

/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 postrotateと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 でデフォルト以外のフォーマットで日付ファイル名にしたいとき
logrotate.confファイルを読み解くメモ
rsyslogを利用したログファイル作成と、logrotateを利用したログのローテーション
logrotate(ログローテート)の動作確認