rsyslog version 8 で syslog受信

# rsyslog version 8 で syslog受信
プログラミングとは少しずれますが、

syslogを受信する機会があり、Ubuntu 16.04にrsyslogが入っていることもわかったのですが、設定方法に複数個の回答があった上に、結局最後まで最新の書き方に沿ったものが見つからなかったので記事にエントリー。

## 背景
BUFFALOのルータからsyslogを514/udpで転送し、Ubuntu16.04のパソコンで受信する。
なお、ルータのsyslog転送設定は割愛する。

## 設定ファイルの場所
Ubuntu 16.04 のrsyslogの設定ファイルは`/etc/rsyslog.conf`です。
設定は`/etc/rsyslog.d/`以下に足したほうが整理ができますが、説明ではrsyslog.confに直接書き加えます。

## することの概要
1. rsyslogに用意されているモジュールを有効にする。
2. 受信の設定を行う。
3. ファイルへの書き出しの設定をする。

## 手順
### モジュールを有効にする。
設定ファイル`/etc/rsyslog.conf`を開くと以下のような序文と MODULES の設定が目に入る。

```
#  /etc/rsyslog.conf  Configuration file for rsyslog.
#
#     For more information see                                                                                                                        
#     /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html
#
#  Default logging rules can be found in /etc/rsyslog.d/50-default.conf


#################
#### MODULES ####
#################

module(load="imuxsock") # provides support for local system logging
module(load="imklog")   # provides kernel logging support
#module(load="immark")  # provides --MARK-- message capability

# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")

# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514")

# Enable non-kernel facility klog messages
$KLogPermitNonKernelFacility on
```

ここでudpによる受信(`imudp`)と、ファイルへの書き出しを行う(`omfile`)モジュールをロードする。

まず、`imudp`であるが、 `#module(load="imudp")` のコメントを外し、 `module(load="imudp")` にすれば良い。
次に `omfile`だが、その一行上などにでも `module(load="buildin:omfile")` と書き込めば良い。

編集後のファイルは以下のようになる。

```
#################
#### MODULES ####                                                                                                                                     
#################

module(load="imuxsock") # provides support for local system logging
module(load="imklog")   # provides kernel logging support
#module(load="immark")  # provides --MARK-- message capability
module(load="builtin:omfile")

# provides UDP syslog reception
module(load="imudp")
#input(type="imudp" port="514")
```

それぞれのmoduleの行からそのモジュールが有効になる。
この先の編集では、モジュールを読み込む前に使用することが無いよう気をつけると良い。

### 受信の設定を行う

受信の設定は `input` を用いる。
`module(load="imudp")`の次の行にある`#input(type="imudp" port="514")`をコメントアウトすれば、その後レガシーに利用できる。

しかし、ここでは次のファイルへの書き出しのために少々変更を加え、ルールセットを使用するようにする。
`input(type="imudp" port="514" ruleset="remote")`
rulesetの名前`remote`と言う名は何でも良い。この後にrulesetに対する処理を記述する。

### ファイルへの書き出しの設定をする。

rulesetに対する具体的な処理を記述することで、受信したsyslogへの処理を書く。
書く位置はmoduleの読み込みにさえ気をつければどこでも良い。しかし、分割して管理する必要もないのでinputの次の行に書くこととする。

```
input(type="imudp" port="514" ruleset="remote")
ruleset(name="remote"){
  action(type="omfile" file="/var/log/remote.log")
}
```

ここではモジュール`omfile`を使用して`/var/log/remote.log`へ出力するように設定した。
これは動作上は `*.* /var/log/remote.log` に相当する。もちろんフィルタしてからactionすることも可能だが、今回は省略した。

#### なぜrulesetを使うのか
今回のような単純な例ではrulesetを使用した意味が無いように見えるが、重要な役割がrulesetにある。

それは、混線の防止である。
旧来のrsyslogでは、受信logと手元のlogが一度統合され、そこからフィルターを駆使して受信ファイルを抽出していた。
しかし、rulesetを用いるとinputにて手に入れたlogはそのrulesetで処理され、外部に漏れることは無い。そして、その逆に手元のlogが別のrulesetから見えることも無い。

これにより形式的な抽出が不必要となり、見やすくメンテナンスしやすい設定ファイルになる。

## 設定の有効化
設定ファイルを書き換えたら、その設定を有効にしなければならない。
rsyslogを再起動して設定ファイルを読みこませる。

```bash
service rsyslog restart
```

以上で設定は終わりです。きちんと設定されていれば`/var/log/remote.log`に転送されたsyslogが出力されます。

もし、出力されない場合は、設定がきちんとなされているか、設定ファイルが読み込まれたか、ファイアウォールに弾かれてないか、moduleを実行してから各種moduleを使用しているかなどを確認してみてください。

## 追加の設定など
現在の設定だと、送られてきたsyslogは全て受け入れてしまうので、inputを変更して特定のアドレスからのみに制限してみます。

```
input(type="imudp" port="514" address="192.168.11.1" ruleset="remote")
```

これだけで、`192.168.11.1` のみを"remote" rulesetで処理できます。

サーバが複数あって、それぞれ動作を変えたい場合は、inputを増やしてaddressとrulesetを変更すればよいです。

version 8 になる前のrsyslogを触ったことはありませんが、相当簡単に設定できるようになっていると思いますので、ぜひ新しい書き方に移行してみてくださいませ。

## 参考
[rsyslog 公式サイト](http://www.rsyslog.com/)
[imudp module reference](http://www.rsyslog.com/doc/v8-stable/configuration/modules/imudp.html)
[omfile module reference](http://www.rsyslog.com/doc/v8-stable/configuration/modules/omfile.html)
[Newbie guide to rsyslog](http://www.rsyslog.com/newbie-guide-to-rsyslog/)
[Using the syslog receiver module](http://www.rsyslog.com/using-the-syslog-receiver-module/)
[Receiving Messages from a Remote System](http://www.rsyslog.com/receiving-messages-from-a-remote-system/)