ずっと syslog-ng 使ってたんですが、systemd に移行していくと基本的に journald があれば syslogd はなくてもよい1)ものになっていたり、あと gentoo 的に mysql サポートが外されて2)たり?? よくわからなくなっていたので rsyslog 使ってみることにしました。
うちの環境では、全ての kvmゲスト の syslog を kvmホストに転送して、kvmホストは自身の syslog も含めて全て mysql に突っ込みます。突っ込んだ syslog は cacti(github) の syslog pluginで閲覧できるようにしています。
ちなみに rsyslog.conf の書式は、できるだけ現時点で最も新しい書式にあわせているつもりです。3)
rsyslog.conf に journald 連携の設定を追加します。
module( load="imjournal" IgnorePreviousMessages="on" )
IgnorePreviousMessages
は「過去に遡って取り込まない」宣言です。このモジュールの他のオプションはオフィシャルのimjournalを参照してください。
もし、デフォルトでカーネルロギングが有効になっている場合は、コメントアウトしておきます。
#module(load="imklog")
恐らくですが journald が /dev/kmsg を読んでいるので、rsyslogd でカーネルロギングを有効にしてしまうと、同じメッセージが2回ずつ出力されてしまいます。
rsyslog.conf に1行書くだけです。
*.* @ip.addr.to.host:514
うちの環境では基本的に syslog のファイル出力はしないので、デフォルトで用意されている omfile
モジュールを使ったファイル出力の設定は全部コメントアウトしています。ファイル出力を併用したり転送するログをフィルタリングする場合は、色々条件を追記したりこの1行を書く場所に注意したりする必要がありますが、全転送なら基本的にこれで大丈夫です。ちなみに @@ip.addr.to.host:514
とかすると tcp 転送ができたり、なんなら ssl まで使えるようです……今んとこ udp で十分なのでやったことないですけど。
upd 入力と mysql 出力を設定します。
gentoo の場合、mysql の出力モジュールはデフォルトでは組み込まれないため USE=mysql
で emerge しておきます。
# USE=mysql emerge -av rsyslog
こんな感じで設定を追加します。
module(load="imudp") input( type="imudp" address="ip.addr.for.listen" port="514" )
gentoo の場合、デフォルトの rsyslog.conf には address
は書いてなかったのですが、なんとなくこういうのはキッチリ指定したいのでw 他のオプションはオフィシャルのimudpを参照してください。
rsyslog.conf に追加するのは3行です。
まず ommysql モジュールをロードします。
module(load="ommysql.so")
cacti の syslog plugin に付いている /path/to/cacti/plugins/syslog/syslog.sql で定義されている syslog_incoming テーブルにあわせて、こんな感じで sql を書いて template を定義します。
$template cacti_syslog_tpl,"INSERT INTO syslog_incoming(facility_id, priority_id, program, date, time, host, message) values (%syslogfacility%, %syslogpriority%, '%programname%', '%timereported:::date-mysql%', '%timereported:::date-mysql%', '%FROMHOST%', TRIM('%msg%'))", SQL
最後に出力設定です。*.*
で全ての facility 且つ、全ての priority の……要は全部の syslog を、cacti_syslog_tpl を使って ommysql モジュール経由で出力する、とかそういう意味だと思います。
*.* :ommysql:<mysql_host>,<mysql_db_name>,<mysql_user>,<mysql_password>;cacti_syslog_tpl