クラウドや仮想環境を使ってWebサーバの複数台構成が当たり前になっています。
複数台構成になると各サーバ毎に保存されているログをわざわざ各サーバにログインして確認するのは面倒です。
また、クラウドなどの場合、一時的なアクセス増に対応するためなどのために一時的にサーバを増強するということは、
日常的になっており、これを毎回まとめるとなると手間が掛かることは間違いないです。
このようなことからログを集約するログサーバを立て、各サーバからログを受付、送信の仕組みが必要になります。
ログの集約などを検索するとFluentdなどの多くのツールもありますが、
Linuxのログ出力ツールとして古くから使われているsyslogの後継に当たるrsyslogを使ってみました。
rsyslogは、最近のディストリビューションではデフォルトになってきているようです。
今回の構成としては、単純にWebのアクセス、エラーログをログサーバに送信し、
ログサーバ側で保存するという仕組みにしています。
送信側の設定
rsyslogでリモートでログを出力した場合、Perlなどのスクリプトを使った方法もありますが、
ログをloggerコマンドで送信する方法の方が仕組みとして単純のような気がするので、
loggerコマンドでの設定になっています。
アクセスログをlocal2のファシリティ、エラーログをlocal1のファシリティを使って送信しています。
送信側のWebサーバの設定
CustomLog "|/usr/bin/logger -p local2.info -t [ドメイン名など]" combined ErrorLog "|/usr/bin/logger -p local1.info -t [ドメイン名など]-error"
1行目でlocal1,local2のファシリティに対してログを保存しないように設定しています。
2、3行目では、送信先のサーバを設定しています。
「@」は、UDPでの送信になります。
「@@」に設定するとTCPでの送信になります。
TCPよりUDPの方が負荷が低いのでUDPの設定にしています。
送信側のrsyslog.confの設定
*.info;mail.none;authpriv.none;cron.none;local1.none;local2.none -/var/log/messages local2.debug @[ログの送信先サーバのIP、もしくはホスト名] local1.debug @[ログの送信先サーバのIP、もしくはホスト名]
受信側の設定
受信側の設定では、imudpとimtcpのモジュールがデフォルトではコメントアウトされているのでコメントアウトを外す。
後、rsyslogの接続ポート514番も使えるように設定する。
ログの出力先を設定し、local1、local2のファシリティのログ出力を設定する。
受信側の設定
# Provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 # Provides TCP syslog reception $ModLoad imtcp $InputTCPServerRun 514 $template MsgFormat, "%msg:2:$%\n" $template httpd_access, "/var/log/rsyslog/[ドメイン名など]/httpd_access_%$year%%$month%%$day%.log" $template httpd_error, "/var/log/rsyslog/[ドメイン名など]/httpd_error_%$year%%$month%%$day%.log" local2.debug -?httpd_access;MsgFormat local1.debug -?httpd_error;MsgFormat