カテゴリー
Linux

logrotate の設定をサンプルから勉強します♪【実践的】

logrotate の設定ポイント

※数値は具体例です。

  • 設定ファイルは /etc/logrotate.d/ に作成
  • 設定ファイル名は自由
  • #コメント行
  • 1行目にローテートを設定するログファイルをフルパスで記述
  • missingok ログファイルがなければエラーメッセージを出力しない
  • notifempty 元のログファイルが空なら、ローテーションしない
  • sharedscripts postrotate 〜 endscript 「〜」に記述された内容を実行する。
  • weekly 週ごとにログファイルを置き換える。
  • yearly 年ごとにログファイルを置き換える。
  • rotate 4 ログを 4 世代分残す。
  • size 30 k ログのサイズが 30 k バイトを超えていればローテーションを行う。
  • create 0600 root root ローテーション実行後、空の新規ログファイルを属性を指定(パーミッション 0600 ユーザ、グループ root)して作成する。

はじめに

yum でインストールした時、各パッケージの logrotate 設定ファイルも自動で作成されることがあります。書き方を覗いてみました。自分で設定ファイルを作成するときの参考としたいのです!先人の傾向を読み取ろうと、がんばります♪

[root@localhost ~]# ll /etc/logrotate.d/
合計 40
-rw-r--r-- 1 root root 167  1月 10 22:27 httpd
-rw-r--r-- 1 root root 173  1月  9 20:21 iscsiuiolog
-rw-r--r-- 1 root root 871 12月 28 23:28 mysqld
-rw-r--r-- 1 root root  61  1月  9 15:13 rpm
-rw-r--r-- 1 root root 306  4月  3  2010 syslog
-rw-r--r-- 1 root root 100  7月 26  2012 yum

上記の設定は以前、次の投稿で作成したウェブのローカル開発環境にある logrotate 設定を見たものになります。

以下、個別に内容を見ていきます。

/etc/logrotate.d/httpd

/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}

各行の意味です。最終行のカッコは除外しています。

  1. 最初の行にどのログファイルに関する設定かを記述
  2. ログファイルがなければエラーメッセージを出力しない。次のログファイルの処理を行う。
  3. 元のログファイルが空なら、ローテーションしない。
  4. 以降の prerotate、postrotate に記述された処理をワイルドカードの指定に関わらず、1度だけ実行する。
  5. ローテーション終了後に本行(postrotate)から endscript までの処理を実行する。
  6. Apache 設定ファイルをリロードする。その際の出力は破棄する。Apache の動作中にファイルを移動すると、Apache は出力すべきログファイルを見失ってしまう。そのため、Apache 設定ファイルをリロードさせて設定を再読み込みさせ改めて出力させるログファイルを Apache に認識させる。
  7. コマンドの終了

6番目の解説が自信ありません。正しいはずですが、不慣れなため腑に落ちない感覚です。次に行きます。

/etc/logrotate.d/iscsiuiolog

/var/log/iscsiuio.log {
    weekly
    missingok
    notifempty
    rotate 4
    sharedscripts
    postrotate
    pkill -USR1 iscsiuio 2> /dev/null || true
    endscript
}
  1. 最初の行にどのログファイルに関する設定かを記述
  2. ログファイルを週ごとに置き換える。
  3. ログファイルがなければエラーメッセージを出力しない。次のログファイルの処理を行う。
  4. 元のログファイルが空なら、ローテーションしない。
  5. ログを4世代分残す。
  6. 以降の prerotate、postrotate に記述された処理をワイルドカードの指定に関わらず、1度だけ実行する。
  7. ローテーション終了後に本行(postrotate)から endscript までの処理を実行する。
  8. iscsiuio を再起動する。その際の出力は破棄する。動作中にファイルを移動すると、出力すべきログファイルを見失ってしまう。そのため、pkill -USR1 でiscsiuio を再起動させて設定を再読み込みさせ、改めて出力させるログファイルを認識させる。
  9. コマンドの終了

pkill -USR1 の情報に確信が持てません。。。たぶん合っているとは思うのですが。この点で参考にさせていただいたページです。Apache に関する話題ですので、自信が持てないのです。

/etc/logrotate.d/mysqld

# This logname can be set in /etc/my.cnf
# by setting the variable "err-log"
# in the [safe_mysqld] section as follows:
#
# [safe_mysqld]
# err-log=/var/log/mysqld.log
#
# If the root user has a password you have to create a
# /root/.my.cnf configuration file with the following
# content:
#
# [mysqladmin]
# password = <secret> 
# user= root
#
# where "<secret>" is the password. 
#
# ATTENTION: This /root/.my.cnf should be readable ONLY
# for root !

# Then, un-comment the following lines to enable rotation of mysql's log file:

#/var/log/mysqld.log {
#        create 640 mysql mysql
#        notifempty
#	daily
#        rotate 3
#        missingok
#        compress
#    postrotate
#	# just if mysqld is really running
#	if test -x /usr/bin/mysqladmin && \
#	   /usr/bin/mysqladmin ping &>/dev/null
#	then
#	   /usr/bin/mysqladmin flush-logs
#	fi
#    endscript
#}

基本的にログローテートは使用しないようです。使う場合は最後の「#/var/log/mysqld.log {」以下のコメントを外せば良いようです。

つまり 23 〜 38 行目です。この部分は本投稿では解説しないこととします。機会があれば読み込んで勉強したいです。

/etc/logrotate.d/rpm

/var/log/rpmpkgs {
    weekly
    notifempty
    missingok
}
  1. 最初の行にどのログファイルに関する設定かを記述
  2. ログファイルを週ごとに置き換える。
  3. 元のログファイルが空なら、ローテーションしない。
  4. ログファイルがなければエラーメッセージを出力しない。次のログファイルの処理を行う。

普段 yum を使用するため、rpm 関係のログ、rpmpkgs はほぼ出力されないと思っていました。

改めて確認しますとローカル開発環境(仮想マシンで CentOS 5.9 32 bit)では確かに一切出力されておりませんでした。

一方、本番環境(やはり仮想マシン(VPS)で CentOS 5.9 32 bit)では、しっかり出力されております。

どちらの環境でも yum を使用しておりますし、rpm も使用しております。両方の結果が揃っていましたら納得できるのですけれども、、、よくわかりません。

/etc/logrotate.d/syslog

/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
    sharedscripts
    postrotate
	/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
	/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
  1. 最初の行にどのログファイルに関する設定かを記述。今回は6つのファイルに関する設定となる。
  2. 以降の prerotate、postrotate に記述された処理をワイルドカードの指定に関わらず、1度だけ実行する。
  3. ローテーション終了後に本行(postrotate)から endscript までの処理を実行する。
  4. syslogd を再起動する。その際の出力は破棄する。
  5. rsyslogd を再起動する。その際の出力は破棄する。
  6. コマンドの終了

4 番 5 番は今までも出てきています。改めて記述しますと「プログラム動作中にファイルを移動すると、プログラムが出力すべきログファイルを見失ってしまう。そのため、プログラムを(HUP シグナルを送って)再起動させて設定を再読み込みさせ、改めて出力させるログファイルを認識させる。」となります。

やっぱり、この部分は自信がありませんが、おそらく合っていると思います。

★2014年7月6日追記★

kill -HUP ですが、上記の解釈は間違っておりました><。とおりすがりさまが、コメントに次のように調査された方のページも付けて教えてくださいました。感謝いたします。

syslogに関してですが、再起動はしませんし、設定読み込みのためでもありません。
対象ログのinode変更のためです。
こちらを参考にされてください。
http://d.hatena.ne.jp/masudaK/20110914/1315999265

他には、「kill hup」で検索したページも勉強になりますわね♪

/etc/logrotate.d/yum

/var/log/yum.log {
    missingok
    notifempty
    size 30k
    yearly
    create 0600 root root
}
  1. 最初の行にどのログファイルに関する設定かを記述
  2. ログファイルがなければエラーメッセージを出力しない。次のログファイルの処理を行う。
  3. 元のログファイルが空なら、ローテーションしない。
  4. ログのサイズが 30 k バイトを超えていればローテーションを行う。
  5. ログファイルを年ごとに置き換える。
  6. ローテーション実行後、空の新規ログファイルを属性を指定(パーミッション 0600 ユーザ、グループ root)して作成する。

yum は頻繁には実行せず、ログファイルも簡単には肥大しないため、年ごとのローテーションとする!ということなのだと思います。

おわりに

今回、勉強しましたのは先日の投稿で新たに logrotate 設定ファイルを追加しようと思ったものの、どのように書いたら良いかわからなかったからです。

今回まとめてみて、大分勉強になりました。

logrotate の個別のログファイルについて、大分理解が深まったと思います。参考になった、特にオプション!、ページです。ありがとうございます!

また、以前購入しましたこちらの書籍が大変参考になりました。編集の目を通ったものが掲載されているため、情報の精度に信頼をおける部分が心強いです。

具体的に参考になったのは、PDF にある次の特集です。

  • WEB+DB PRESS Vol.12 はじめての Apache [第5回] ログ 阿曽村 一郎(P195 ~ 196)

以上です。

「logrotate の設定をサンプルから勉強します♪【実践的】」への3件の返信

とおりすがりさま、コメントありがとう存じます。

確かに参考のページを拝見しますと、inode だけが変更され、プロセス ID が変更されておりません!
再起動も設定読み込みもなさらないのですね!
大変勉強になりました♪
有意義な情報を提供してくださり、重ねて厚く御礼申し上げます。

コメントを残す