rsyslog でログを受信する
TCP で受信する
module(load="imtcp") input(type="imtcp" port="514")
UDPで受信する
module(load="imudp") input(type="imudp" port="514")
TCPとUDPの両方で受信する。
module(load="imtcp") input(type="imtcp" port="514") module(load="imudp") input(type="imudp" port="514")
リッスンするアドレスを明示する
module(load="imtcp") input(type="imtcp" port="514" address="192.168.2.240")
送信元を限定する。
$AllowedSender TCP ,127.0.0.1, 192.168.142.0/24 $AllowedSender UDP ,127.0.0.1, 192.168.142.0/24
ログが混じるので、分離する(ルールセット)
module(load="imtcp") input(type="imtcp" port="514" address="192.168.1.11" ruleset="remote") ## template template ( name="RemoteHostR" type="string" string="/var/log/rsyslog/%hostname%.log" ) ## log file ruleset(name="remote") { *.* action(type="omfile" dynafile="RemoteHost" name="save_remote") }
rsyslog のシンタックスチェック
sudo rsyslogd -N 1
特定のファイルだけ調べたいとき(あまり使わない。)
sudo rsyslogd -N 1 -f /etc/rsyslog.d/99-takuya.conf
再起動
書いたらシンタックスがOKなら、再起動する。
sudo systemctl restart rsyslog
送信元からログをテスト送信する。
ログ送信テスト
ssh sender-machine sender$ logger -p syslog.info -t TEST $(printf %05d $RANDOM)." Hello from $HOST b "
ログが受信されるのを確認する。
rsyslog$ tail -f /var/log/rsyslog/sender.log Sep 2 23:35:36 acid TEST: 23680. Hello from sender Sep 2 23:35:36 acid TEST: 05423. Hello from sender Sep 2 23:35:37 acid TEST: 00688. Hello from sender Sep 2 23:35:37 acid TEST: 17254. Hello from sender Sep 2 23:35:38 acid TEST: 19391. Hello from sender Sep 2 23:35:38 acid TEST: 29833. Hello from sender Sep 2 23:35:39 acid TEST: 00841. Hello from sender Sep 2 23:35:39 acid TEST: 02411. Hello from sender Sep 2 23:35:39 acid TEST: 23659. Hello from sender
これで、無事にログが別のサーバーに転送される。
ログの分離/ rulesetによるコンタミの防止
今回のような単純な例ではrulesetを使用した意味が無いように見えるが、重要な役割がrulesetにある。
それは、混線の防止である。 旧来のrsyslogでは、受信logと手元のlogが一度統合され、そこからフィルターを駆使して受信ファイルを抽出していた。 しかし、rulesetを用いるとinputにて手に入れたlogはそのrulesetで処理され、外部に漏れることは無い。そして、その逆に手元のlogが別のrulesetから見えることも無い。 https://qiita.com/forno/items/0df30fa3dc055da61c7d
受信したログが、交じるので、交じる前に仕分ける。
input(type="imudp" port="514" ruleset="remote") ruleset(name="remote"){ action(type="omfile" file="/var/log/remote.log") }
なにもしないと混じる
rsyslog -> input -> tcp -> 交じる -> filter -> /var/log/message
ルールセットにしてルール化する。
## 混じらない rsyslog -> input -> tcp -> ruleset -> filter -> /var/log/remote
ログの受信設定を書くときは、受信設定を書いた方がいい。
たとえば、次のようにローカルと他ホスト受信をif で分けたとしても、いったん全部まとめてから指定マッチだけを別ファイルに書き出しているので、/var/log/message,syslog に両方出てしまうのです。
検索するとよく出てくる例(混線・コンタミします。)
# 略 auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog # ←すでに混じってる。 #auth,authpriv.none -/var/log/syslog #cron.* /var/log/cron.log #daemon.* -/var/log/daemon.log ## 略 if ($fromhost-ip contains "192.168.20.") then { *.* action(type="omfile" dynafile="RemoteHostRain" name="save_remote") *.* action(type="omfile" dynafile="DailyPerHostLogs" name="save_per_days") }
簡単です
ログ転送って面倒こともなく、送信元と受信先に設定するだけで掛けるのはとても楽ちんですね。
ログを監視する目的でもなければ、転送なんてって思うかもしれないけど。
nvme が突然死したときにログがなかったので何が起きたか全くわかりませんでした。
NVMEのSSDは多分今後も突然死をすると思うので、ログだけでも残そうと思います。