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 }
各行の意味です。最終行のカッコは除外しています。
- 最初の行にどのログファイルに関する設定かを記述
- ログファイルがなければエラーメッセージを出力しない。次のログファイルの処理を行う。
- 元のログファイルが空なら、ローテーションしない。
- 以降の prerotate、postrotate に記述された処理をワイルドカードの指定に関わらず、1度だけ実行する。
- ローテーション終了後に本行(postrotate)から endscript までの処理を実行する。
- Apache 設定ファイルをリロードする。その際の出力は破棄する。Apache の動作中にファイルを移動すると、Apache は出力すべきログファイルを見失ってしまう。そのため、Apache 設定ファイルをリロードさせて設定を再読み込みさせ改めて出力させるログファイルを Apache に認識させる。
- コマンドの終了
6番目の解説が自信ありません。正しいはずですが、不慣れなため腑に落ちない感覚です。次に行きます。
/etc/logrotate.d/iscsiuiolog
/var/log/iscsiuio.log { weekly missingok notifempty rotate 4 sharedscripts postrotate pkill -USR1 iscsiuio 2> /dev/null || true endscript }
- 最初の行にどのログファイルに関する設定かを記述
- ログファイルを週ごとに置き換える。
- ログファイルがなければエラーメッセージを出力しない。次のログファイルの処理を行う。
- 元のログファイルが空なら、ローテーションしない。
- ログを4世代分残す。
- 以降の prerotate、postrotate に記述された処理をワイルドカードの指定に関わらず、1度だけ実行する。
- ローテーション終了後に本行(postrotate)から endscript までの処理を実行する。
- iscsiuio を再起動する。その際の出力は破棄する。動作中にファイルを移動すると、出力すべきログファイルを見失ってしまう。そのため、pkill -USR1 でiscsiuio を再起動させて設定を再読み込みさせ、改めて出力させるログファイルを認識させる。
- コマンドの終了
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 }
- 最初の行にどのログファイルに関する設定かを記述
- ログファイルを週ごとに置き換える。
- 元のログファイルが空なら、ローテーションしない。
- ログファイルがなければエラーメッセージを出力しない。次のログファイルの処理を行う。
普段 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 }
- 最初の行にどのログファイルに関する設定かを記述。今回は6つのファイルに関する設定となる。
- 以降の prerotate、postrotate に記述された処理をワイルドカードの指定に関わらず、1度だけ実行する。
- ローテーション終了後に本行(postrotate)から endscript までの処理を実行する。
- syslogd を再起動する。その際の出力は破棄する。
- rsyslogd を再起動する。その際の出力は破棄する。
- コマンドの終了
4 番 5 番は今までも出てきています。改めて記述しますと「プログラム動作中にファイルを移動すると、プログラムが出力すべきログファイルを見失ってしまう。そのため、プログラムを(HUP シグナルを送って)再起動させて設定を再読み込みさせ、改めて出力させるログファイルを認識させる。」となります。
やっぱり、この部分は自信がありませんが、おそらく合っていると思います。
★2014年7月6日追記★
kill -HUP ですが、上記の解釈は間違っておりました><。とおりすがりさまが、コメントに次のように調査された方のページも付けて教えてくださいました。感謝いたします。
他には、「kill hup」で検索したページも勉強になりますわね♪
/etc/logrotate.d/yum
/var/log/yum.log { missingok notifempty size 30k yearly create 0600 root root }
- 最初の行にどのログファイルに関する設定かを記述
- ログファイルがなければエラーメッセージを出力しない。次のログファイルの処理を行う。
- 元のログファイルが空なら、ローテーションしない。
- ログのサイズが 30 k バイトを超えていればローテーションを行う。
- ログファイルを年ごとに置き換える。
- ローテーション実行後、空の新規ログファイルを属性を指定(パーミッション 0600 ユーザ、グループ root)して作成する。
yum は頻繁には実行せず、ログファイルも簡単には肥大しないため、年ごとのローテーションとする!ということなのだと思います。
おわりに
今回、勉強しましたのは先日の投稿で新たに logrotate 設定ファイルを追加しようと思ったものの、どのように書いたら良いかわからなかったからです。
今回まとめてみて、大分勉強になりました。
logrotate の個別のログファイルについて、大分理解が深まったと思います。参考になった、特にオプション!、ページです。ありがとうございます!
また、以前購入しましたこちらの書籍が大変参考になりました。編集の目を通ったものが掲載されているため、情報の精度に信頼をおける部分が心強いです。
具体的に参考になったのは、PDF にある次の特集です。
- WEB+DB PRESS Vol.12 はじめての Apache [第5回] ログ 阿曽村 一郎(P195 ~ 196)
以上です。
syslogに関してですが、再起動はしませんし、設定読み込みのためでもありません。
対象ログのinode変更のためです。
こちらを参考にされてください。
http://d.hatena.ne.jp/masudaK/20110914/1315999265