syslog(rsyslog)について動かしながら勉強してみた

syslog(rsyslog)についてあまり良く分かってなかったので動かしながら挙動を確認したときのメモ。

# 環境

+ Amazon Linux AMI 2016.03.0 (HVM)


# 確認する

どのsyslogデーモンプロセスが動いているか確認

```bash
$ps aux|grep syslog|grep -v grep
root      2107  0.0  0.2 247468  2608 ?        Sl   Apr19   0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
```

rsyslogのプロセスが動いていました。

バージョンは以下

```bash
$rsyslogd -v
rsyslogd 5.8.10, compiled with:
	FEATURE_REGEXP:				Yes
	FEATURE_LARGEFILE:			No
	GSSAPI Kerberos 5 support:		Yes
	FEATURE_DEBUG (debug build, slow code):	No
	32bit Atomic operations supported:	Yes
	64bit Atomic operations supported:	Yes
	Runtime Instrumentation (slow code):	No

See http://www.rsyslog.com for more information.
```


自動起動の設定もされていました。

```bash
$ll /etc/rc.d/rc3.d/ |grep syslog
lrwxrwxrwx 1 root root 17  3月 16 23:03 S12rsyslog -> ../init.d/rsyslog
```

また、設定ファイルは以下のようになっていました。
(必要部分のみ抜粋)

```/etc/rsyslog.conf
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog

# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 *

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

$IncludeConfig /etc/rsyslog.d/*.conf
```

+ 最初の行でログのフォーマットを指定(RSYSLOG_TraditionalFileFormat)
+ 以降の行からどのファシリティ、プライオリティの場合にどのログファイルに出力するかを記載
+ 最終行で`/etc/rsyslog.d/*.conf`配下の設定ファイルを読み込むように記載

ファシリティ、プライオリティは`logger`コマンドでログメッセージを送る際に-pオプションで指定できます。以下に例を記載します。

```bash
# cronファシリティのinfoプライオリティ
$logger -p cron.info hogefuga

# mailファシリティのalertプライオリティ
$logger -p mail.alert poyo
```

なおEC2ではcloud-init用の設定がありました。

```/etc/rsyslog.d/21-cloudinit.conf
# Log cloudinit generated log messages to file
:syslogtag, startswith, "[CLOUDINIT]" /var/log/cloud-init.log

# comment out the following line to allow CLOUDINIT messages through.
# Doing so means you'll also get CLOUDINIT messages in /var/log/syslog
& ~
```

RSYSLOG_TraditionalFileFormatのフォーマットは以下のようになっております。

`"%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n\"`


[LOGフィルタリングによる振り分け](http://windbell.dip.jp/?p=232)

上記を見るとsyslogtagの部分が[CLOUDINIT]となっているものについては/var/log/cloud-init.logに記載しろというような命令のようです。
こちらは後で確認します。

# loggerコマンドを使ってみる

syslogにログ情報を渡すために`logger`コマンドを使って確認してみます。

最初に単純にメッセージのみ送ってみます。

```bash
$logger default-log

# /var/log/message
Apr 23 07:51:21 ip-172-31-27-76 ec2-user: default-log
```

/var/log/messageに出力されました。
man loggerを見るとファシリティ、プライオリティを何も指定しないとuserファシリティ、noticeプライオリティになると書いてあったので設定ファイルの条件により/var/log/messageに記載されたと思われます。

次に別のファイルに書き込むように設定してみます。

```bash
$logger -p mail.info mail log death

# /var/log/maillog
Apr 23 08:34:13 ip-172-31-27-76 ec2-user: mail log death
```

設定ファイルの通り、mailファシリティなので` /var/log/maillog`に出力されました。

また、先ほど確認したcloud-initについても確認してみます。
-tオプションを指定してタグを[CLOUDINIT]と記載し、ログがどのように出力されるか確認します。

```bash
# タグで[CLOUDINIT]を指定
$logger -t [CLOUDINIT] hoge
```

上記によって以下の2ファイルへの書き込みが確認できました。

```/var/log/messages
Apr 23 12:34:21 ip-172-31-27-76 [CLOUDINIT]: hoge
```

```/var/log/cloud-init.log
$Apr 23 12:34:21 ip-172-31-27-76 [CLOUDINIT]: hoge
```


# シェルスクリプトで使う

以下のようにすれば良い感じにsyslog経由で`/var/log/message`に出力することが出来ます。

```exampleLog.sh
#!/bin/bash

readonly FULL_PATH=`pwd`/`basename $0`

infolog() {
  msg=$1
  logger -t $FULL_PATH $msg
}

infolog 'start'
infolog 'end'
```

```/var/log/message
Apr 23 12:19:51 ip-172-31-27-76 /home/ec2-user/exampleLog.sh: start
Apr 23 12:19:51 ip-172-31-27-76 /home/ec2-user/exampleLog.sh: end
```

また、syslogの設定ファイルにルールを追記し、対象のファシリティなどの追記を行えば、別ファイルへの書き込みなども出来ます。