15分で理解するApacheのログローテート
Apacheのaccess_logはすぐ大きくなりますよね。
ログファイルのサイズが大きくなれば、ログ解析のときにも困るし、運用に支障が出ます。
というわけで、今回はApacheのaccess_logのログローテートテクニックについて、具体例を交えながら解説してみようと思います。
ローテートの方法として以下3つの手法を考えてみます。
- cronとシェルスクリプトの合わせ技で頑張る
- Apacheのに搭載されている機能を使う
- logrotate.dに頼る
具体的な手順・解説は以下のとおり。
その1:cronとシェルスクリプトの合わせ技
以下のようなスクリプトを作成し、cronに仕込んでみます。
1 2 3 4 5 6 7 |
#!/bin/sh HIDUKE='date +%y%m%d' cd
/usr/local/apache2/logs mv
access_log access_log.$HIDUKE ../bin/apachectl graceful sleep
600 gzip access_log access_log.$HIDUKE |
解説
やっていることは、ログファイルを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です。
1 2 3 4 |
# vi httpd.conf CustomLog
"|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/access_log.%Y%m%d 86400 540"
combined |
解説
やっていることは、24時間ごとに別名で保存してるだけです。
それでは、以下、各行毎に見ていきましょう。
/access_log.%Y%m%d
access_log.年月日 という別名にローテートします。
86400
ローテートする周期を"秒"で指定します。86400で24時間ですね。
540
日本時間用のオフセット値です。設定しておかないと、UTCで0時に実行されるため、日本では毎朝9時に実行されることになります。
その3:logrotate.dに頼る
/etc/logrotate.d 用の設定ファイルを作成して、logrotate.d にお任せする方法です。
設定ファイルをhttpdという名前にする場合は以下のように書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# vi /etc/logrotate.d/httpd /usr/local/apache2/logs/access_log
{ missingok notifempty daily rotate
30 compress sharedscripts postrotate /usr/local/apache2/bin/apachectl graceful endscript } |
解説
やっていることは、毎日ローテートして圧縮、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 元と同じディレクトリにローテーションしたログを保存
日本実業出版社
売り上げランキング: 2437
助かる本です
助かりました。
著者は・・・
情報が豊富
初心者にもオススメ
ディスカッション
コメント一覧
まだ、コメントがありません