15分で理解するApacheのログローテート

2009年8月29日

Apacheのaccess_logはすぐ大きくなりますよね。
ログファイルのサイズが大きくなれば、ログ解析のときにも困るし、運用に支障が出ます。

というわけで、今回はApacheのaccess_logのログローテートテクニックについて、具体例を交えながら解説してみようと思います。
ローテートの方法として以下3つの手法を考えてみます。

  1. cronとシェルスクリプトの合わせ技で頑張る
  2. Apacheのに搭載されている機能を使う
  3. logrotate.dに頼る

具体的な手順・解説は以下のとおり。

その1:cronとシェルスクリプトの合わせ技

以下のようなスクリプトを作成し、cronに仕込んでみます。

解説

やっていることは、ログファイルをmvで別名に変更後、圧縮してるだけです。

それでは、以下、各行毎に見ていきましょう。

mv access_log access_log.$HIDUKE

mvでaccess_log.年月日 という名前にローテートしています。

/apachectl graceful

待機状態のhttpdプロセスだけを再起動を実施するオプションです。

ユーザ接続中のhttpdプロセスは処理が終了してから再起動するという、サービス停止の影響を最低限に押さえることのできる便利なオプションです。

sleep 600

gracefulでいつ処理が終わるか分からないので、なんとなく600秒待ってみます。

gzip access_log access_log.$HIDUKE

容量削減のためにgzipで圧縮します。

その2:Apacheに最初から付いてる機能を使う

実は、Apacheにはrotatelogsという機能があります。

有効化するためには、httpd.conf内のCustomLog識別子を以下のように編集すればOKです。

解説

やっていることは、24時間ごとに別名で保存してるだけです。

それでは、以下、各行毎に見ていきましょう。

/access_log.%Y%m%d

access_log.年月日 という別名にローテートします。

86400

ローテートする周期を"秒"で指定します。86400で24時間ですね。

540

日本時間用のオフセット値です。設定しておかないと、UTCで0時に実行されるため、日本では毎朝9時に実行されることになります。

その3:logrotate.dに頼る

/etc/logrotate.d 用の設定ファイルを作成して、logrotate.d にお任せする方法です。

設定ファイルをhttpdという名前にする場合は以下のように書きます。

解説

やっていることは、毎日ローテートして圧縮、30日以上前のログは消えるという設定です。

それでは、以下、各行毎に見ていきましょう。

missingok

ログファイルが存在しない場合にエラーを出力しません。

notifempty

ログファイルが空の場合ローテーションしません。

daily

毎日

rotate 30

30個までログを残します。

compress

gzipで圧縮します。

sharedscripts

ログファイルを複数指定した場合、それぞれpostrotate、prerotate内のコマンドを実行します。

postrotate

endscriptとの間に書いたコマンドをローテーション後に実行します。

詳細なlogrotateのオプションの解説

ローテーションの実行・回数

  • daily 毎日
  • weekly 毎週
  • monthly 毎月
  • rotate 指定した回数ローテーション(いくつログファイルを残すか)
  • rotate [ローテーション回数]

ログの圧縮

  • compress ログをgzipで圧縮
  • nocompress 圧縮しない

その他

  • ifempty ログファイルが空の場合でもローテーション
  • notifempty ログファイルが空の場合ローテーションしない
  • missingok ログファイルが存在しない場合にエラーを出力しない
  • nomissingok ログファイルが存在しない場合にエラーを出力
  • postrotate endscriptとの間に書いたコマンドをローテーション後に実行
  • prerotate endscriptとの間に書いたコマンドをローテーション前に実行
  • size ログファイルが指定サイズ以上の場合ローテーション
  • size [ファイルサイズ]
  • sharedscripts ログファイルを複数指定した場合、それぞれpostrotate、prerotate内のコマンドを実行
  • create ローテーション後、空のログファイルを作成
  • create [パーミッション] [ユーザ名] [グループ名] で権限の指定可能
  • nocreate 空のログファイルを作成しない
  • olddir 指定したディレクトリにローテーションしたログを保存
  • olddir [ディレクトリ名]
  • noolddir 元と同じディレクトリにローテーションしたログを保存
図解でわかる Linuxサーバ構築・設定のすべて
一戸 英男
日本実業出版社
売り上げランキング: 2437
おすすめ度の平均: 4.5

5 助かる本です
4 助かりました。
5 著者は・・・
4 情報が豊富
5 初心者にもオススメ