syslog(rsyslog)についてあまり良く分かってなかったので動かしながら挙動を確認したときのメモ。
環境
- Amazon Linux AMI 2016.03.0 (HVM)
確認する
どのsyslogデーモンプロセスが動いているか確認
$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のプロセスが動いていました。
バージョンは以下
$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.
自動起動の設定もされていました。
$ll /etc/rc.d/rc3.d/ |grep syslog
lrwxrwxrwx 1 root root 17 3月 16 23:03 S12rsyslog -> ../init.d/rsyslog
また、設定ファイルは以下のようになっていました。
(必要部分のみ抜粋)
$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オプションで指定できます。以下に例を記載します。
# cronファシリティのinfoプライオリティ
$logger -p cron.info hogefuga
# mailファシリティのalertプライオリティ
$logger -p mail.alert poyo
なおEC2ではcloud-init用の設定がありました。
# 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\"
上記を見るとsyslogtagの部分が[CLOUDINIT]となっているものについては/var/log/cloud-init.logに記載しろというような命令のようです。
こちらは後で確認します。
loggerコマンドを使ってみる
syslogにログ情報を渡すためにlogger
コマンドを使って確認してみます。
最初に単純にメッセージのみ送ってみます。
$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に記載されたと思われます。
次に別のファイルに書き込むように設定してみます。
$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]と記載し、ログがどのように出力されるか確認します。
# タグで[CLOUDINIT]を指定
$logger -t [CLOUDINIT] hoge
上記によって以下の2ファイルへの書き込みが確認できました。
Apr 23 12:34:21 ip-172-31-27-76 [CLOUDINIT]: hoge
$Apr 23 12:34:21 ip-172-31-27-76 [CLOUDINIT]: hoge
シェルスクリプトで使う
以下のようにすれば良い感じにsyslog経由で/var/log/message
に出力することが出来ます。
#!/bin/bash
readonly FULL_PATH=`pwd`/`basename $0`
infolog() {
msg=$1
logger -t $FULL_PATH $msg
}
infolog 'start'
infolog 'end'
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の設定ファイルにルールを追記し、対象のファシリティなどの追記を行えば、別ファイルへの書き込みなども出来ます。