作成開始 : 平成20年02月11日(月) 最終更新日 : 平成20年02月16日(土)
FreeBSDでApacheのログをローテートする。
わが家のサーバー機は旧式のため毎週土曜日に停止し休息させています。
その時にApacheのログを rm コマンドで削除してから shutdown しています。まぁ、アクセス数少ないし
Delegate でリバースプロキシしているからログの削除は二週間に一回ですけどね。
しかし、最近はこれも面倒くさくなってきました。よってログをローテートしてみます。
FreeBSDの newsyslog を使ってみます。Linuxだと logrotate が標準のようですがこれはまた別の機会にします。
1.newsyslog の動作
ログのバックアップを繰り返し取っていき、指定された個数を越えたバックアップは 消去します。さらに、このバックアップはgz圧縮やbz圧縮することが出来ます。
バックアップのタイミングとしては、・・・・・・
■前回のバックアップから目的の時間を経過した時
■目的の時間(指定時刻)になった時
■指定サイズを超過した時
・・・・の3パターンから選択します。
2./etc/newsyslog.conf の内容
ディフォルトでは次のようになっていました。
では、各項目の意味を見てみましょう。[ ] は省略可能です。
# logfilename [owner:group] mode count size when [ZJB] [/pid_file] [sig_num]
◆logfilename
ローテートしたいログファイル名です。
◆[owner:group]
ログファイルのオーナーとグループです。
◆mode
mode(パーミッション)です。
◆count
保存するバックアップファイルの数の指定です。この数を超過した場合は古い順に消去されます。
◆size
ログがこのサイズを超過した場合にバックアップを取ります。単位は、Kbyteです。 ここが*の場合は、sizeでのタイミングではなくなるのでwhen側の指定が有効となります。
◆when
バックアップを取るタイミングが時間指定の場合はここに記入します。ここが*の場合は、size側の設定が有効となります。
@ は制限付きISO8601時刻フォーマットを利用すると言う意味です。
ex : @T00とは、毎日0時にバックアップするという意味です。
@01T05とは、毎月1日5時を表します。
$ は毎月・毎週・毎日バックップしたい場合の指定です。
フォーマットは、Dhh、Ww、WwDhh、Mdd、 MddDhhのどれかを使います。
D:毎日
W:毎週
M:毎月
hh:時間(0〜23)
w:曜日(0:日曜日〜6:土曜日)
dd:日(1〜31)
L:月の最後の日
ex : $M1D0とは、毎月1日0時を表している。$W6D0とは、毎週土曜日0時を表しています。
◆ [ZJB]
圧縮をするかしないかを表しています。
Z:gz圧縮してバックアップ
J:bz圧縮してバックアップ
B:圧縮せずにそのままバックアップ
◆ [/pid_file]
これは、バックアップを取るときにシグナルを与えなければ行けない場合にpidファイルのバスを指定するものです。
Aapche の場合は httpd.conf 内の PidFile です。
◆[sig_num]
必要なデーモンにログファイルが変更されたことを伝えるのに SIGUSR1 というシグナルを送る必要があります。 UNIX(POSIX) の SIGUSR1 の値が 30 番なのでその値を書くことになってるようです。(「SIGUSR1」で検索してみると一杯出てきます)
3.Apache ログをローテート
/etc/newsyslog.conf に以下を設定します。そして、newsyslog を実行します。
■ローテートの条件
毎週土曜日の0:00にローテートする。ローテートする個数は6、バックアップは圧縮しないでそのままします。
(圧縮と個数は様子見て考えます)
なので・・・
/var/log/httpd-access.log 644 6 * $W6D0 B /usr/local/apache/logs/httpd.pid 30
/var/log/httpd-error.log 644 6 * $W6D0 B /usr/local/apache/logs/httpd.pid 30
・・・・を /etc/newsyslog.conf に追記しました。
4.結果
結果確認は次回土曜日( 2月16日)にします。
↓
おぉーーーーちゃんとローテートしているぞぉー
【戻る】