rsyslog のセットアップ

ずっと syslog-ng 使ってたんですが、systemd に移行していくと基本的に journald があれば syslogd はなくてもよい1)ものになっていたり、あと gentoo 的に mysql サポートが外されて2)たり?? よくわからなくなっていたので rsyslog 使ってみることにしました。

うちの環境では、全ての kvmゲスト の syslog を kvmホストに転送して、kvmホストは自身の syslog も含めて全て mysql に突っ込みます。突っ込んだ syslog は cacti(github) の syslog pluginで閲覧できるようにしています。

ちなみに rsyslog.conf の書式は、できるだけ現時点で最も新しい書式にあわせているつもりです。3)

systemd/journald 連携

rsyslog.conf に journald 連携の設定を追加します。

module(
    load="imjournal"
    IgnorePreviousMessages="on"
)

IgnorePreviousMessages は「過去に遡って取り込まない」宣言です。このモジュールの他のオプションはオフィシャルのimjournalを参照してください。

もし、デフォルトでカーネルロギングが有効になっている場合は、コメントアウトしておきます。

#module(load="imklog")

恐らくですが journald が /dev/kmsg を読んでいるので、rsyslogd でカーネルロギングを有効にしてしまうと、同じメッセージが2回ずつ出力されてしまいます。

udp 転送

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

udp 入力待ち受け

こんな感じで設定を追加します。

module(load="imudp")
input(
        type="imudp"
        address="ip.addr.for.listen"
        port="514"
)

gentoo の場合、デフォルトの rsyslog.conf には address は書いてなかったのですが、なんとなくこういうのはキッチリ指定したいのでw 他のオプションはオフィシャルのimudpを参照してください。

mysql 出力

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
1)
journald が使いやすいかどうかは置いておいて……
2)
昔は USEフラグに mysql ってあったんですけどね……
3)
rsyslog は後方互換のために 1つの目的を達成するにも実に多彩な書式を許容しているようです……ネットで調べると混乱しますw
https://manimani.cc/lib/plugins/linkback/exe/trackback.php/wiki:linux:setup_rsyslog