UJP - 技術情報1

Life is fun and easy!

不正IP報告数

Okan Sensor
 
メイン
ログイン
ブログ カテゴリ一覧

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]#
  • -fコマンドを指定して強制的に実行する.
[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となっているが,アンダバーなので,ログスイッチされない.


広告スペース
Google