2014-11-30
RHEL7/CentOS7のjournaldについてのもろもろ
journaldとは?
systemdの環境で、標準的に提供されるログ管理のサービスです。正式名称は、下記の「systemd-journald.service」です。
# systemctl status systemd-journald.service systemd-journald.service - Journal Service Loaded: loaded (/usr/lib/systemd/system/systemd-journald.service; static) Active: active (running) since 月 2014-11-24 16:27:08 JST; 5 days ago Docs: man:systemd-journald.service(8) man:journald.conf(5) Main PID: 334 (systemd-journal) Status: "Processing requests..." CGroup: /system.slice/systemd-journald.service └─334 /usr/lib/systemd/systemd-journald 11月 24 16:27:08 server01 systemd-journal[334]: Runtime journal is using 8.0.... 11月 24 16:27:08 server01 systemd-journal[334]: Runtime journal is using 8.0.... 11月 24 16:27:08 server01 systemd-journal[334]: Journal started 11月 24 16:27:11 server01 systemd-journal[334]: Runtime journal is using 8.0.... Hint: Some lines were ellipsized, use -l to show in full.
RHEL7/CentOS7では、従来のrsyslogdも並行して稼働しています。
# systemctl status rsyslog.service rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled) Active: active (running) since 月 2014-11-24 16:27:12 JST; 5 days ago Main PID: 526 (rsyslogd) CGroup: /system.slice/rsyslog.service └─526 /usr/sbin/rsyslogd -n 11月 24 16:27:12 server01 systemd[1]: Started System Logging Service.
Fedora20では、もはやrsyslogdは動いておらず、システムログ管理は、journaldに完全移行しています。
ちなみに、「systemdはひとつのバイナリーでなんでもかんでもやりやがって、Unixの伝統をなんだと思ってんだ」的な声を聞くこともありますが、journaldは、systemd本体とは別のバイナリーで動作する普通のデーモンです。独自のAPI(ライブラリ関数)を提供しており、systemd本体とは独立したコンポーネントです。(systemdのサービスとして起動する前提で作られてはいますが。)ひとつのバイナリーでなんでもかんでもやってるわけではありませんです。
journaldがログを保存する場所
RHEL7/CentOS7のデフォルトでは、「/var/run/log/journal」以下です。ここは、OSを再起動すると消える領域なので、journaldは、直近の起動直後のログのみを保存していることになります。
永続的にログを保存したい場合は、ディレクトリー「/var/log/journal」を作って再起動します。このディレクトリーがあると、jounraldはこちらにログを保存します。
Fedora20では、最初から/var/log/journalが用意されています。
なお、「/var/run/log/jounral」「/var/log/journal」のどちらを使用する場合でも、無制限にログをためていくわけではありません。保存用ディレクトリーの全容量に対して10%以上になるか、該当ディレクトリーのファイルシステムの空き容量が15%以下になると、古いエントリーから順に削除されていきます。
journaldがログを収集する方法
・systemdのサービスとして起動したデーモンの標準出力/標準エラー出力の内容
・ローカルのプロセスがsyslogに出力したメッセージ(外部からのメッセージは収集しないはず)
・journald独自のAPI(ライブラリ関数)に対して出力したメッセージ
です。syslog宛のメッセージは、rsyslogdよりも先にjournaldが/dev/logから奪います。その後で、rsyslogdがimjournalモジュールを使って、journaldから受け取ります。
/etc/rsyslog.conf
$ModLoad imjournal # provides access to the systemd journal
また、journaldは、syslogメッセージを受け取ると、その内容をパースして、送信元のPIDを見つけて、該当PIDのプロセスの諸々の情報(メタデータ)を一緒に記録します。そのため、各メッセージについて、「どのサービスが出力したメッセージなのか」なども把握しています。
journaldが収集したログの確認方法
基本は次のとおり。
・すべてのログをlessにパイプして閲覧
# journalctl
・lessがいらないとき(-lをつけないと画面の右端でカットされる。)
# journalctl -l --no-pager
・特定サービスのログだけ見るとき
# journalctl -u hoge.service
・メタデータを含めて全部見たいとき
# journalctl -u hoge.service -o json-pretty
・tail -f コマンドっぽく、ログの新規出力を観察したいとき
# journalctl -f
その他のオプションは、manページか、下記の資料を参考にしてください。
- 13 http://t.co/dmjClrU0VY
- 5 https://www.google.co.jp/
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CB8QFjAA&url=http://d.hatena.ne.jp/enakai00/20130917/1379374797&ei=q3N6VNWbF9H98QWt1YK4Bw&usg=AFQjCNFji_gOzfLajfpFU34oyjZHAsivXw&bvm=bv.80642063,d.dGc
- 2 http://b.hatena.ne.jp/
- 2 http://feedly.com/
- 2 http://www.google.co.jp/url?url=http://d.hatena.ne.jp/enakai00/20111004/1317718773&rct=j&frm=1&q=&esrc=s&sa=U&ei=73Z6VIytJIeF8QWb5IGgCA&ved=0CB0QFjAB&usg=AFQjCNEkLqiUrDMRTCSc1ITIQ7d7r4tI-Q
- 1 http://api.twitter.com/1/statuses/show/538867385499783168.json
- 1 http://api.twitter.com/1/statuses/show/538885636229304320.json
- 1 http://api.twitter.com/1/statuses/show/538891177575972864.json
- 1 http://ec2-54-248-216-105.ap-northeast-1.compute.amazonaws.com/e/xkba