波打際のブログさん

主に、プログラミング備忘録など。

Apacheのログ設定まとめ

はじめに

 apacheのログについて、調べる機会があったので備忘録としてまとめておきます。

環境

  • CentOS6.4
  • apache2.4.4

バーチャルホスト毎にログを記録する

 バーチャルホストで複数のサービスを運営している際に、それぞれのホスト毎にログファイルを分けると管理が容易になります。

バーチャルホスト設定の編集

 設定はとても簡単で、バーチャルホストの設定(conf/extra/httpd-vhosts.conf)にCustomLog(アクセスログ)とErrorLog(エラーログ)の設定を記述するだけです。

<VirtualHost *:80>
    DocumentRoot "/htdocs/nyaruko"
    ServerName www.nyaruko.cqc
    CustomLog logs/nyaruko_server_access_log common
    ErrorLog  logs/nyaruko_server_error_log
</VirtualHost>

ログのローテートを行う

 日別や週別、月別などにログを分けて保存することをログのローテートと言います。ログのローテート方法はいくつか有りますが、今回はapacheに付属しているrotatelogsを利用する方法と、logrotateを利用する方法の2つを紹介します。

rotatelogsを利用する

 apacheに付属しているログのローテートツールです。ログの出力先としてパイプすることでログを分けて管理することができます。

CustomLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/nyaruko_access_log_%Y%m%d 86400 540" common
第一引数

 ログの出力先を記述します。今回は /usr/local/apache2/logs/nyaruko_access_log_%Y%m%d と記述しているので、logs/nyaruko_access_log_20130814 という形式で出力されます。

第二引数

 ログの周期を記述します。86400sec=24h

第三引数

 時差を記述します。540min = 9h GMT(日本標準時)

logrotateを利用する

 CentOS6.4に標準で搭載されているlogrotateを利用すると、apacheに限らず様々なログを容易にローテートできます。 /etc/logrotate.d ディレクトリ以下に、新たにファイルを作成して設定を記述することでローテートが可能です。今回は /etc/logrotate.d/httpd-nyaruko という名前でファイルを作成して設定を記述しました。

# 対象のログファイル
/usr/local/apache2/logs/nyaruko_access_log {
 
	# ローテートの実行方式
	# 移動&作成		: create
	# コピー			: copy
	# コピー&削除		: copytruncate
	create	
 
	# ログファイルが見つからない際の挙動
	# エラーを吐く		: nomissingok
	# エラーを吐かない		: missingok
	missingok
 
	# ログファイルが空の際の動作
	# 空でも実行		: ifempty
	# 空の場合は実行しない	: noifempty
	notifempty
 
	# ローテーションの頻度
	# 日単位			: daily
	# 週単位			: weekly
	# 月単位			: monthly
	daily
 
	# 生成されるログファイル数の上限
	rotate 7
 
	# 圧縮設定
	# 圧縮			: compres
	# 未圧縮			: nocompress
	# 遅延圧縮		: delaycompress
	compres
 
	# ローテート時にスクリプト実行
	sharedscripts
	postrotate
		/sbin/service httpd reload
	endscript
}

 apache+logrotateではローテート実行時に、sharedscripts設定を記述して再起動を行います。再起動しないでローテートする場合はcreateではなくcopytruncateを指定します。しかし、ローテート中にアクセスがあった場合のログが記録されないのでログに漏れが発生します。

 nginx+logrotateの場合は再起動せずに、ログの漏れもなくローテートが実行できますが、その設定はまた次の機会に・・・。

所感

 apacheでログをローテートするならrotatelogsを使ったほうが、サービスを止めたり、ログの紛失がなくローテートができそう・・・ただしrotatelogsはログの削除ができないので、自分でシェルスクリプトを書いてcronで叩かないといけない。。。さらに、ログ一回吐き出すたびにrotatelogsにパイプするのって負荷がかかりそうな・・・よし、俺のVPSにはnginx使おう←イマココ