nginxのsyslog転送でちょっとハマったのでポイントをメモします。
環境
Amazon Linux AMI release 2013.09
nginx 1.7.6
rsyslog 5.8.10
ハマりポイント
syslogtagは英数のみ
試しにtagにhttp-access
を指定してみると
nginx.conf
access_log syslog:server=転送先サーバのIP:514,facility=local1,tag=http-access,severity=info main;
下記のようにNginxさんに怒られます。
console
# /etc/init.d/nginx configtest
nginx: [emerg] syslog "tag" only allows alphanumeric characters in /etc/nginx/nginx.conf:10
nginx: configuration file /etc/nginx/nginx.conf test failed
ハイフンぐらい使いたかったよ。。
転送はudp
syslog転送する設定例
転送元設定
nginx.conf
access_log syslog:server=転送先サーバのIP:514,facility=local1,tag=httpaccess,severity=info main;
転送先設定
/etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
/etc/rsyslog.d/nginx.conf
$template access_log, "%msg:2:$%\n"
$template access_log_file, "/var/log/rsyslog/nginx/%hostname%-%fromhost-ip%-access_log.%$NOW%"
if $syslogfacility-text == 'local1' and $syslogtag == 'httpaccess:' then -?access_log_file;access_log
あとは、転送元サーバからのUDP:514ポートを解放すればOK
でも既存のlogサーバはTCPしか受け付けてくれないないんだけど。。
そんなときは、一旦ローカルのrsyslog等でUDPで受けてからTCPで転送しなおせば大丈夫
TCPでsyslog転送する設定例
転送元設定
nginx.conf
access_log syslog:server=127.0.0.1:514,facility=local1,tag=httpaccess,severity=info main;
/etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
/etc/rsyslog.d/nginx.conf
local1.* @@転送先サーバのIP:514
転送先設定
/etc/rsyslog.conf
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
/etc/rsyslog.d/nginx.conf
$template access_log, "%msg:2:$%\n"
$template access_log_file, "/var/log/rsyslog/nginx/%hostname%-%fromhost-ip%-access_log.%$NOW%"
if $syslogfacility-text == 'local1' and $syslogtag == 'httpaccess:' then -?access_log_file;access_log
転送元サーバからのTCP:514を解放すること。