rsyslog.confの文法

## ■ rsyslogとは

アプリケーションから通知されたメッセージをログファイルに保存するLinuxのログ管理システム。

## ■ /etc/rsyslog.confの文法

### ● 基本構成

セレクタ(出力対象ログの内容設定)とアクション(出力先のログファイルの設定)で構成される。

下記のような形式で指定する。

複数のセレクターを定義するには、セミコロン (;) を使用して区切ぎる。

```bash
# セレクタ   アクション
authpriv.* /var/log/auth.log

# セレクタ;セレクタ      アクション
mail.info;authpriv.none /var/log/messages
```

#### セレクタ

出力対象のログメッセージを指定する。

ファシリティ(≒ログの種類)と、プライオリティ(≒ログのレベル)を設定する。

下記のように```ファシリティ.プライオリティ```という形式で指定する。

定義するファシリティ、プライオリティが複数になる場合は、コンマ (,) を使用して区切ります。

```bash
# ファシリティ.プライオリティ
mail.info

# ファシリティ,ファシリティ.プライオリティ
auth,authpriv.none

```

##### ファシリティ

ログの種類を示す。

下記のように分類されている。

|**facility**|**対象のログ**|
|:---:|:---:|
|**authpriv**|認証サービス　|
|**cron**|cronのメッセージ|
|**daemon**|デーモンのメッセージ|
|**kern**|カーネルのメッセージ|
|**lpr**|プリンタサービスのメッセージ|
|**mail**|メールサービスのメッセージ|
|**news**|ニュースサービスのメッセージ|
|**syslog**|syslogのメッセージ|
|**user**|ユーザープロセスのメッセージ|
|**uucp**|uucp転送を行うプログラムのメッセージ|
|**local0～7**|独自に利用できるファシリティ|

##### プライオリティ ( セビリティ )

ログのレベル(重要度)を示す。

|**priority**|**内容**|
|:---:|:---:|
|**emerg**|システムが停止するようなエラーを示すメッセージ|
|**alert**|緊急に対処すべきエラーを示すメッセージ|
|**crit**|ハードウェアの傷害など致命的なエラーを示すメッセージ|
|**err**|一般的なエラーメッセージ|
|**warning**|警告メッセージ|
|**notice**|通知メッセージ|
|**info**|一般的な情報メッセージ|
|**debug**|デバッグメッセージ|
|**none**|ログメッセージ出力しない設定|
|*|すべてのプライオリティを示す|

local0.noneとした場合、local0のログは出力されなくなる。

#### アクション

ログファイルの出力先の設定。

出力先のログファイルのファイルパスを記載する。

ハイフン「-」を先頭につけると、ログの書き込みが非同期になる。
非同期モードの場合、ストレージ(永続領域)への書き込みをダイレクトに行わなくなる。
一度、バッファ領域(一時領域)に保存してから、順次ストレージへの保存を行う。

非同期モードのメリットは、

* 大量のログ出力が同時に発生した場合に、ディスクI/Oを軽減できる

非同期モードのデメリットは、

* ストレージへの書き移しが完了していない状態で、サーバが停止すると、ログが消失する


https://milestone-of-se.nesuke.com/l7protocol/syslog/rsyslog-summary/


```bash
mail.info;authpriv.err; /var/log/messages
daemon.* 　　　　　　　 -/var/log/daemon.log
```

### ● テンプレート

出力先や出力メッセージの形式をカスタマイズできる機能。

```bash
# テンプレートの定義
# $template テンプレート名, テンプレート形式
$template TemplateName1,"%timereported% %hostname% %syslogfacility-text%.%syslogseverity-text%: %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
$template TemplateName2,"/var/log/%programname%.log"

# テンプレートの適応方法
# セレクタ アクション;テンプレート名
local1.* /var/log/messages;TemplateName1

# 動的なテンプレートの適用
# 疑問符「?」の後ろにテンプレート名を指定すると動的ファイルパスになる
# セレクタ ?テンプレート名
local1.* ?TemplateName2

```

#### プロパティ

出力するログをカスタマイズするために、独自のデータを追加する機能。

%プロパティ名%のように定義すると定義したプロパティに応じた文字列に置換される。

```bash
$template TemplateName1,"%timereported% %hostname% %syslogfacility-text%.%syslogseverity-text%: %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
$template TemplateName2,"/var/log/%programname%.log"
```

プロパティの例として、下記のようなものがある。


|プロパティ|説明|
|---|---|
|%timereported%|ログが出力された日時|
|%timestamp:::date-year%|ログのタイムスタンプの年|
|%timestamp:::date-month%|ログのタイムスタンプの月|
|%timestamp:::date-day%|ログのタイムスタンプの日|
|%timestamp:::date-hour%|ログのタイムスタンプの時|
|%timestamp:::date-minute%|ログのタイムスタンプの分|
|%timestamp:::date-second%|ログのタイムスタンプの秒|
|%timestamp:::date-subseconds%|ログのタイムスタンプのミリ秒|
|%hostname%|ログを出力したホストの名前|
|%syslogfacility-text%|ファシリティ名|
|%syslogseverity-text%|プライオリティ名|
|%syslogtag%|ログのタグ ( apache[123], systemd[123], CRON[123]などのメッセージの出力対象プロセス )|
|%programname%|ログのタグ ( apache, systemd, CRONなどのメッセージの出力対象プロセス名 )|
|%msg%|メッセージ本体|
|%msg:1:2%|syslog メッセージ中の1～2文字目|
|%msg:::drop-last-lf%|syslog メッセージの全メッセージテキストを取得して、最後のラインフィード文字を省く|
|%sp-if-no-1st-sp%|フィールドの最初の文字がスペースじゃないときにのみ、スペースを返す|
|%fixed-width%|指定された桁数分足りていない場合にスペースで穴埋め (rsyslog 8.13.0から導入)|


http://www.rsyslog.com/doc/v8-stable/configuration/property_replacer.html

---

## ■ 文法チェック

* /etc/rsyslog.confのチェックを行う

```bash
$ rsyslogd -N 1
```

バージョンエラーが出る場合は、cオプションを使う。

```bash
$ rsyslogd -N 1 -c5
```

* loggerコマンドでのテスト

下記コマンドで実際にsyslogに対して出力テストが可能。

```bash
logger -p local1.info "test info message."
logger -p local1.warn "test warn message."
```

---

## 参考
* https://www.rsyslog.com/doc/v8-stable/configuration/property_replacer.html
* /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html