{{tag>linux rsyslog gentoo cacti}} # rsyslog のセットアップ ずっと syslog-ng 使ってたんですが、systemd に移行していくと基本的に journald があれば syslogd はなくてもよい((journald が使いやすいかどうかは置いておいて……))ものになっていたり、あと gentoo 的に mysql サポートが外されて((昔は USEフラグに mysql ってあったんですけどね……))たり?? よくわからなくなっていたので rsyslog 使ってみることにしました。 うちの環境では、全ての kvmゲスト の syslog を kvmホストに転送して、kvmホストは自身の syslog も含めて全て mysql に突っ込みます。突っ込んだ syslog は [cacti](http://www.cacti.net)([github](https://github.com/Cacti/cacti)) の [syslog plugin](https://github.com/Cacti/plugin_syslog)で閲覧できるようにしています。 ちなみに rsyslog.conf の書式は、できるだけ現時点で最も新しい書式にあわせているつもりです。((rsyslog は後方互換のために 1つの目的を達成するにも実に多彩な書式を許容しているようです……ネットで調べると混乱しますw)) ## 送信側の設定 ### systemd/journald 連携 rsyslog.conf に journald 連携の設定を追加します。 ``` module( load="imjournal" IgnorePreviousMessages="on" ) ``` `IgnorePreviousMessages` は「過去に遡って取り込まない」宣言です。このモジュールの他のオプションはオフィシャルの[imjournal](http://www.rsyslog.com/doc/v8-stable/configuration/modules/imjournal.html)を参照してください。 もし、デフォルトでカーネルロギングが有効になっている場合は、コメントアウトしておきます。 ``` #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](http://www.rsyslog.com/doc/v8-stable/configuration/modules/imudp.html)を参照してください。 ### 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:,,,;cacti_syslog_tpl ```