Posted at

受け取ったrsyslogの要素を出力する


目的

rsyslogで受け取ったsyslogメッセージを他Appで解析する際になーんかうまく解析できねーぞと。

そのApp側で要素をdebug出力してくれればいいんだけど、開発チームと試験チーム、構成管理チームが別々だとそんな依頼すんのも面倒くさい。構成管理チームで一時解析してやろーじゃねーかと。

もしくは、どっかの誰かがうちのサーバにsyslogを送りつけてきやがる。犯人探したろ!みたいなとき。


環境

# cat /etc/redhat-release

CentOS release 6.6 (Final)

# rpm -qa rsyslog
rsyslog-5.8.10-10.el6_6.x86_64


実現方法

rsyslogのフォーマット(テンプレート)機能を使う。

デフォルトのフォーマット(テンプレート)には%HOSTNAME%はあるけど%fromhost-ip%が入ってない。不親切。


/etc/rsyslog.conf

  # UDPでのシスログの受信を許可

$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514

#### GLOBAL DIRECTIVES ####
+ $template template_out, "----------\ntimestamp:%TIMESTAMP%\nfromhost-ip:%fromhost-ip%\nhostname:%HOSTNAME%\nsyslogtag:%syslogtag%\nmsg:%msg:::drop-last-lf%\n"
+ *.* /tmp/syslog_out.log;template_out


上記のように編集してrsyslogを再起動。

# service rsyslog restart

システムロガーを停止中: [ OK ]
システムロガーを起動中: [ OK ]
#

指定した「/tmp/syslog_out.log」をtailしてみる。

# tail -F /tmp/syslog_out.log

----------
timestamp:Feb 27 17:23:49
fromhost-ip:127.0.0.1
hostname:MYHOST
syslogtag:test:
msg: test syslog error 034
----------
timestamp:Feb 27 17:23:51
fromhost-ip:129.33.3.33
hostname:FORING_SERV
syslogtag:abcdefg:
msg: INFO [org.projectxxxx.core.sw.xxxx.xxxxx:TF-1-controller-timer-0] xxx1004: Quarantine state timed out for xxx xxID[xx:xx:xx:xx:xx:xx:xx:xx]. Disconnecting switch.
----------
timestamp:Feb 27 17:23:51
fromhost-ip:129.33.3.33
hostname:FORING_SERV
syslogtag:abcdefg:
msg: INFO [org.projectxxxx.core.sw.xxxx.xxxxx:TF-1-controller-timer-0] xxx1002: [[xx:xx:xx:xx:xx:xx:xx:xx(0x0) from xx.xx.xx.xx:xxxx]] Disconnected connection

満足するまで確認したら/etc/rsyslog.confを元に戻して# service rsyslog restartしておく。


ちなみに

良くある問い合わせが「loggerで送出したテストsyslogがうまく解析できない」なんて言われて確認すると

# logger -p user.err "test: hogehoge"なんて感じでシスログタグをmsgに入れ込んでたりする。

ホントによくある。人生でもう5回以上別の人から聞かれた。そんなに知らんもんかねみんな。