読者です 読者をやめる 読者になる 読者になる

kzk-casino.com

一人前のITエンジニアを目指して

Linuxのシステムログを理解する

Tech Tips

今までなんとなくしかわかっていなかった、システムログ、特にrsyslogの挙動について整理します。

前提

ログの収集にはsyslog(rsyslog)が使用されることが一般的なので、そちらを整理します。

環境はAWSのEC2を使って、OSはAmazon Linux(ami-0c11b26d)を使用します。

環境の準備

まずはEC2にsshして、rsyslogがインストールされ、稼働していることを確認します。

$ sudo /etc/init.d/rsyslog status
rsyslogd (pid  5935) を実行中...

もしrsyslogがない場合はyumでインストールする必要があります。

また、ローカルではターミナルを2つ立ち上げておき、片方をログ出力用、片方をログ閲覧用としておきます。

ログの出力・閲覧

デフォルトログ出力

ログ閲覧用のターミナルで下記のコマンドを実行して、/var/log/messagesに出力されるログをリアルタイムに閲覧します。

$ sudo tail -f /var/log/messages

次にログ出力用のターミナルで下記のコマンドを実行します。

$ logger this-is-test-log

loggerコマンドは、システムログへの書き込みを実行してくれるコマンドで、上記のコマンドにより、システムログに対して
" this-is-test-log "というログを出力しています。

実際に、ログ閲覧用のターミナルを見ると、上記のログが出力されていることがわかります。

ログの分岐

ここで、loggerコマンドを実行するときに、特にOptionを指定しなかったので、デフォルトログとして
/var/log/messagesに出力されました。

しかし、実際にrsyslogで扱えるシステムログはたくさんあり、例えば

  • /var/log/secure
  • /var/log/cron
  • /var/log/maillog
  • /var/log/spooler

などもrsyslogがログをハンドリングしてログ出力させることができます。

これらのログファイルにrsyslogから書き込むには、「ファシリティ」と「プライオリティ」という情報が必要です。
rsyslogではこれをルールと呼び、<ファシリティ>.<プライオリティ>と指定します。

rsyslogの設定ファイルである/etc/rsyslog.confには、どのファシリティ・プライオリティのログがきたら、
どのファイルにどんなフォーマットで書き込むか、ということが規定されています。

例えば、

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

の記載から、「ファシリティが"authpriv"に一致するログは/var/log/secureに書き込む」と規定されていることがわかり、

# Everybody gets emergency messages
*.emerg                                                 *

の記載から、「プライオリティが"emerg"のログはすべてのシステムログに書き込む」と規定されていることがわかります。


実際にloggerコマンドを用いてログの出力先が変わることを確認してみます。

ログ閲覧用のターミナルで下記のコマンドを実行して、/var/log/secureをモニタリングします。

$ sudo tail -f /var/log/secure

次にログ出力用のターミナルで下記のコマンドを実行します。

logger -p authpriv.info this-is-auth-test-log

これにより、rsyslogのルールとしてファシリティ:authpriv、プライオリティ:info のログを出力したことになるので、
/var/log/secureにログが出力されることになります。

ちなみに、/etc/rsyslog.confには下記の指定もあります。

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

上を見ると、ファシリティ:全て、プライオリティ:infoのログは/var/log/messagesに出力されることになっているので、
上で実行したログ出力は/var/log/messagesにも記載されていることになります。

各プロセスから出力されるログは、このようにrsyslogのファシリティとプライオリティを用いたルールを指定することで
どのログファイルに出力させるかを規定しています。

ちなみに、CentOS6(Amazon Linux)で指定できるファシリティとプライオリティについては下記が参考になります。
CentOS 6 - Rsyslog - ファシリティとプライオリティ : Server World

ログのフォーマット

ログは、規定で下記のフォーマットで出力されています。

Month Day hh:mm:ss HOSHTNAME USERNAME: Log Message

これは、/etc/rsyslog.confの下記の部分で指定されています。

# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

この変数名を変更すれば、ログの出力フォーマットが変わります。

例えば、下記のように変更して

# Use default timestamp format
# $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$ActionFileDefaultTemplate RSYSLOG_DebugFormat

rsyslogを再起動して

$ sudo /etc/init.d/rsyslog restart
システムロガーを停止中:                                    [  OK  ]
システムロガーを起動中:                                    [  OK  ]

ログ出力用ターミナルから下記コマンドを実行すると、

$ logger this-is-test-log2

非常に詳細なログが出力されるようになります。

Debug line with all properties:
FROMHOST: 'ip-10-0-0-168', fromhost-ip: '127.0.0.1', HOSTNAME: 'ip-10-0-0-168', PRI: 13,
syslogtag 'ec2-user:', programname: 'ec2-user', APP-NAME: 'ec2-user', PROCID: '', MSGID: '-',
TIMESTAMP: 'Nov  5 05:48:09', STRUCTURED-DATA: '-',
msg: ' this-is-test-log2'
escaped msg: ' this-is-test-log2'
inputname: imuxsock rawmsg: '<13>Nov  5 05:48:09 ec2-user: this-is-test-log2'

ログの情報が詳細になる分、ログファイルは肥大しやすくなりますので、実際の運用に即したフォーマット選定が必要です。

ログフォーマットとして何を選べるかは下記にまとまっていたので共有します。

[rsyslog] rsyslog.confの設定項目 - Life with IT


非常に基本的な部分のみとなりますが、rsyslogの仕組みについてざっとまとめました。