logrotateを使ってApacheログをローテーションする
logrotateを使ってApacheログをローテーションする
0.改訂履歴
- 2006.05.19 新規作成
- 2007.10.30 よくあるトラブルを追加.
1.はじめに
このドキュメントでは,logrotateを利用して,Apacheのアクセスログをローテーションする手順を説明する. Apacheにはログをローテーションする為のrotatelogという機能が備わっているが,logrotateはsyslog等のローテーションでも使われていて汎用的なので,これを使い慣れていると他のログローテーションにも応用できる点を評価して採用をしている.
また,実用的か否かは別の問題だが,ローテーションした過去ログデータをメールで送信する機能などもあるので,うまく使うことでが色々な自動運転手法が可能となる.
ここで利用しているlogrotateは,RedHatにプレインストールされていものを利用するで,このドキュメントではインストール方法については触れていない.
2.インストール状況を確認する
- RPMコマンドにて,パッケージがインストールされているか確認する.
[root@mars root]# rpm -qa | grep logrotate
logrotate-3.6.9-1
[root@mars root]#
|
- 関連するモジュールをファイルシステムから検索をしてみる.
[root@mars root]# locate logrotate
/var/lib/logrotate.status
/etc/cron.daily/logrotate
/etc/logrotate.d
/etc/logrotate.d/syslog
/etc/logrotate.d/rpm
/etc/logrotate.d/vsftpd.log
/etc/logrotate.d/mgetty
/etc/logrotate.d/psacct
/etc/logrotate.d/mysql
/etc/logrotate.d/cups
/etc/logrotate.d/snmpd
/etc/logrotate.d/uucp
/etc/logrotate.d/redhat-config-network
/etc/logrotate.d/samba
/etc/logrotate.d/squid
/etc/logrotate.d/named
/etc/logrotate.d/cyrus-bigserverd
/etc/logrotate.d/radiusd
/etc/logrotate.d/quagga
/etc/logrotate.d/tux
/etc/logrotate.conf
/usr/share/doc/logrotate-3.6.9
/usr/share/doc/logrotate-3.6.9/CHANGES
/usr/share/man/man8/logrotate.8.gz
/usr/sbin/logrotate
[root@mars root]#
|
- ディストリビューションやOSによってディレクトリが違うこともある.
- 全体的な設定は,logrotate.confに書かれているので,そのファイルを探して中身を確認する.
[root@mars root]# locate logrotate.conf
/etc/logrotate.conf
[root@mars root]# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
[root@mars root]#
|
- /etc/logrotate.dディレクトリ以下にログローテーションの定義ファイルが登録されていることが確認できた.
3.Apacheのログローテーションを設定する
- この中で,syslogのローテーションが参考になりそうなので,syslogファイルを確認してみる.
[root@mars root]# cd /etc/logrotate.d
[root@mars logrotate.d]# cat 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
endscript
}
[root@mars logrotate.d]#
|
行数 |
コマンド |
説明 |
1〜2
|
なし |
ローテーションの対象となるファイルを記述する. 複数記述する際には,ブランクを使う. |
3
|
sharedscripts |
ローテーション対象ファイルが複数ある場合には,この記述が必要. |
4
|
postrotate/endscript |
ローテーションした後に実行するコマンドを記述する. ここでは,kill -HUPにてsyslogを再起動している.
にたようなコマンドでprerotateがあり,これはローテーションする前に実行するコマンドを記述する.
|
- 今回はこれに当てはめて,定義ファイルを作成してみる.
- まず,サンプルとなる定義ファイルを複写する.
[root@mars logrotate.d]# cp syslog apache1
[root@mars logrotate.d]#
|
- ApacheのプロセスIDが記載されているファイルを探す.
[root@mars logrotate.d]# locate httpd.pid
/usr/local/apache/logs/httpd.pid
[root@mars logrotate.d]#
|
[root@mars logrotate.d]# ls -la apache1
-rw-r--r-- 1 root root 225 5月 19 18:53 apache1
[root@mars logrotate.d]# cat apache1
/www/bigserver/log/access.log /www/bigserver/log/err.log {
daily
sharedscripts
rotate 365
compress
postrotate
/bin/kill -HUP `cat /usr/local/apache/logs/httpd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
[root@mars logrotate.d]#
|
- 前述で説明していないコマンドの意味は次の通りとなる.
コマンド |
説明 |
daily |
ローテーションのタイミング. 他にはweeklyやmonthlyを指定することができる,. |
rotate 365 |
ローテーションして保存しておく履歴個数. この定義では365日分を取得することになる. |
compress |
ローテーションしたファイルを圧縮する. |
[root@mars log]# /usr/sbin/logrotate /etc/logrotate.d/apache1 -v
reading config file /etc/logrotate.d/apache1
reading config info for /www/bigserver/log/access.log /www/bigserver/log/err.log
Handling 1 logs
rotating pattern: /www/bigserver/log/access.log /www/bigserver/log/err.log after 1 days (365 rotations)
empty log files are rotated, old logs are removed
considering log /www/bigserver/log/access.log
log does not need rotating
considering log /www/bigserver/log/err.log
log does not need rotating
not running shared postrotate script, since no logs were rotated
[root@mars log]#
|
- エラーが出ていないので,記述自体には問題がない模様.
- ただし,エラーが出なかったからと言って,必ずうまくいくと限らないので注意する.
4.ローテーションを実行する
- 強制的にローテーションを実行して,動作を確認する.
- ちなみに,定義を間違っている場合は定義ファイルで記述したコマンドを最後まで実行できていない事に注意する. どちらにしても,失敗した場合はApacheを再起動すれば元に戻る.
- まず,ログディレクトリを確認する.
[root@mars log]# ls -la
total 16
drwxr-xr-x 2 root root 4096 May 19 20:31 .
drwxr-xr-x 5 root root 4096 May 19 17:11 ..
-rw-r--r-- 1 root root 159 May 19 20:30 access.log
-rw-r--r-- 1 root root 223 May 19 20:30 err.log
[root@mars log]#
|
[root@mars log]# /usr/sbin/logrotate /etc/logrotate.d/apache1 -f
[root@mars log]#
|
[root@mars log]# ls -la
total 16
drwxr-xr-x 2 root root 4096 May 19 20:31 .
drwxr-xr-x 5 root root 4096 May 19 17:11 ..
-rw-r--r-- 1 root root 0 May 19 20:31 access.log
-rw-r--r-- 1 root root 127 May 19 20:30 access.log.1.gz
-rw-r--r-- 1 root root 0 May 19 20:31 err.log
-rw-r--r-- 1 root root 162 May 19 20:30 err.log.1.gz
[root@mars log]#
|
[root@mars log]# ps -ef | grep httpd
root 13422 1 0 17:33 ? 00:00:00 /usr/local/apache/bin/httpd
nobody 14663 13422 0 20:31 ? 00:00:00 /usr/local/apache/bin/httpd
nobody 14664 13422 0 20:31 ? 00:00:00 /usr/local/apache/bin/httpd
nobody 14665 13422 0 20:31 ? 00:00:00 /usr/local/apache/bin/httpd
nobody 14666 13422 0 20:31 ? 00:00:00 /usr/local/apache/bin/httpd
nobody 14667 13422 0 20:31 ? 00:00:00 /usr/local/apache/bin/httpd
root 14670 14341 0 20:32 pts/1 00:00:00 grep httpd
[root@mars log]# /usr/sbin/logrotate /etc/logrotate.d/apache1 -f
[root@mars log]# ls -la
total 24
drwxr-xr-x 2 root root 4096 May 19 20:32 .
drwxr-xr-x 5 root root 4096 May 19 17:11 ..
-rw-r--r-- 1 root root 0 May 19 20:32 access.log
-rw-r--r-- 1 root root 127 May 19 20:32 access.log.1.gz
-rw-r--r-- 1 root root 127 May 19 20:30 access.log.2.gz
-rw-r--r-- 1 root root 0 May 19 20:32 err.log
-rw-r--r-- 1 root root 161 May 19 20:32 err.log.1.gz
-rw-r--r-- 1 root root 162 May 19 20:30 err.log.2.gz
[root@mars log]# ps -ef | grep httpd
root 13422 1 0 17:33 ? 00:00:00 /usr/local/apache/bin/httpd
nobody 14679 13422 0 20:32 ? 00:00:00 /usr/local/apache/bin/httpd
nobody 14680 13422 0 20:32 ? 00:00:00 /usr/local/apache/bin/httpd
nobody 14681 13422 0 20:32 ? 00:00:00 /usr/local/apache/bin/httpd
nobody 14682 13422 0 20:32 ? 00:00:00 /usr/local/apache/bin/httpd
nobody 14683 13422 0 20:32 ? 00:00:00 /usr/local/apache/bin/httpd
root 14686 14341 0 20:32 pts/1 00:00:00 grep httpd
[root@mars log]#
|
- プロセスリストを見ると,コントロール用のhttpdプロセス以外はkill -HUPを受けてプロセスIDが変化していることも確認できる.
5.ログファイル名を日付にする
- ローテーションされたファイルのファイル名を,日付が入った物に設定する.
- ローテーション設定ファイルを,次のように記述する.
[root@mars logrotate.d]# cat apache1
/www/bigserver/log/access.log /www/bigserver/log/err.log {
daily
sharedscripts
rotate 365
compress
postrotate
/bin/kill -HUP `cat /usr/local/apache/logs/httpd.pid 2> /dev/null` 2> /dev/null || true
mv /www/bigserver/log/access.log.1.gz /www/bigserver/log/bigserver.`date +%Y%m%d%H%M%S`.log.gz
endscript
}
[root@mars logrotate.d]#
|
- ここでは,ローテーションされたaccess.logファイルを,bigserver.YYYYMMDDHHMMSS.log.gzとして変更する.
- 不要なファイルを削除する.
[root@mars log]# rm -rf *.gz
[root@mars log]# ls -la
total 8
drwxr-xr-x 2 root root 4096 May 19 20:49 .
drwxr-xr-x 5 root root 4096 May 19 17:11 ..
-rw-r--r-- 1 root root 0 May 19 20:47 access.log
-rw-r--r-- 1 root root 0 May 19 20:47 err.log
[root@mars log]#
|
[root@mars log]# /usr/sbin/logrotate /etc/logrotate.d/apache1 -f
[root@mars log]# ls -la
total 16
drwxr-xr-x 2 root root 4096 May 19 20:49 .
drwxr-xr-x 5 root root 4096 May 19 17:11 ..
-rw-r--r-- 1 root root 0 May 19 20:49 access.log
-rw-r--r-- 1 root root 0 May 19 20:49 err.log
-rw-r--r-- 1 root root 30 May 19 20:47 err.log.1.gz
-rw-r--r-- 1 root root 33 May 19 20:47 bigserver.20060519204937.log.gz
[root@mars log]#
|
- これで日付・時間が入ったファイルが作成されることが確認できた.
- ちなみに,err.logファイルは,当然名前を変更していないので名称が変わらない.
6.その他
- このドキュメントでは利用していないが,便利そうなコマンドを以下にあげておく.
コマンド |
説明 |
missingok |
ログファイルが無くてもエラーとしない. |
nomissingok |
ログファイルがない場合はエラーとする. |
olddir |
指定されたディレクトリにローテーションされたファイルを格納する. |
7.よくあるトラブル
- ローテーションするログファイルのファイル名の拡張子は,".log"をつける.
- Apacheのデフォルトのログファイルでは,access_logとかerror_logとなっているが,アンダバーなので,ログスイッチされない.