それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

rsyslog で ログを受信する設定

rsyslog でログを受信する

TCPUDPで受信ができる

TCP で受信する

module(load="imtcp")
input(type="imtcp" port="514")

UDPで受信する

module(load="imudp")
input(type="imudp" port="514")

TCPUDPの両方で受信する。

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は多分今後も突然死をすると思うので、ログだけでも残そうと思います。

参考資料