server-memo.net

journaldの使い方

      2016/01/22

jouraldについて

CentOS7から新しいログ管理方法として「rsyslog」のほかに「journald」も使用できるようになっています。

この「journald」は「systemd」のコンポーネント(部品)で、サービス名は「systemd-journald.service」となります。

「journald」でログ管理を行うためには、「systemd-journald.service」 が動作していることが前提となります。

この「journald」は使い方を覚えると、ログのフィルタリング等が出来てとても便利なので使い方を説明していきます。

ログの表示方法

全てのログを表示

「journald」に記録されているログを表示させるには、「journalctl」コマンドを使用します。

# journalctl

「journalctl」コマンドを実行すると、ログがページャ(less)に渡されて出力されます。

「--no-pager」オプションを使用することで、全てのログを一気に出力させることができますが、物凄い量のログが表示されていくので使用時は注意してください。

# journalctl -l --no-page

途中で出力を中止させたい場合は「Ctrl + c」で中止できます。

最新のログから表示

「journalctl」コマンドで表示されるログは、記録された順に表示されますが「-r」オプションを指定することで、表示順番が逆になり最新のログから表示されます。

# journalctl -r

最新のログを表示する行数を指定

「-n」オプションを使用することで、最新のログを行数指定で表示することが出来ます。

# journalctl -n [表示する行数]

下記は「-n」オプションを使用して、最新のログ5行分を表示させた際の例となります。

# journalctl -n 5
-- Logs begin at 土 2015-10-17 23:27:04 JST, end at 水 2015-12-02 11:30:01 JST. --
12月 02 11:30:01 local.server-memo.net systemd[1]: Created slice user-997.slice.
12月 02 11:30:01 local.server-memo.net systemd[1]: Started Session 4989 of user root.
12月 02 11:30:01 local.server-memo.net systemd[1]: Starting Session 4989 of user root.
12月 02 11:28:55 local.server-memo.net nm-dispatcher[40278]: Dispatching action 'dhcp4-change' for eno33554984
12月 02 11:28:55 local.server-memo.net systemd[1]: Started Network Manager Script Dispatcher Service.

表示する行数を指定しない場合は、10行分のログが表示されます。

最新のログを表示し続ける

「-f」オプションを使用することで、「tail -f」と同じ様に最新のログを表示し続けることが出来ます。

# journalctl -f

ブート時からのログを表示

「-b」オプションを使用することで、最新のブート時からのログを表示させることが出来ます。

# journalctl -b [ID]

IDを省略した場合は、最新のブート時からのログを表示します。

IDに「1」を指定した場合は、ログに記録されている最初のブートからのログを表示し、「2」を指定した場合は、その次のブートからのログを表示します。

「-1」を指定した場合は、最新のブート時のひとつ前を表示し、「-2」をしてした場合は2つ前を表示します。

プライオリティごとに表示

「-p」オプションを使用することで、「error」や「warning」といった、プライオリティ別にログを表示させることができます。

IDの指定方法は、

# journalctl -p [プライオリティ値 or プライオリティ]

下記は、指定できるプライオリティ値とプライオリティ一覧となります。

プライオリティ
0 emerg
1 alert
2 crit
3 err
4 warning
5 notice
6 debug

プライオリティ値「3」(プライオリティだとerr)を指定して、ログを表示した例です。

# journalctl -p 3 -n 5
-- Logs begin at 土 2015-10-17 23:27:04 JST, end at 木 2015-12-03 21:20:34 JST. --
12月 03 17:07:54 local.server-memo.net kernel: sd 0:0:0:0: [sda] Assuming drive cache: write through
12月 03 17:07:57 local.server-memo.net kernel: piix4_smbus 0000:00:07.3: Host SMBus controller not enabled!
12月 03 17:08:00 local.server-memo.net kernel: intel_rapl: no valid rapl domains found in package 0
12月 03 17:08:04 local.server-memo.net NetworkManager[811]: _nl_get_vtable: assertion 'vtable.handle' failed
12月 03 17:08:04 local.server-memo.net snmpd[1382]: Duplicate IPv4 address detected, some interfaces may not be visible in IP-MIB

プライオリティ値「warning」(プライオリティ値だと4)を指定して、ログを表示した例です。

# journalctl -p warning -n 5
-- Logs begin at 土 2015-10-17 23:27:04 JST, end at 木 2015-12-03 21:20:34 JST. --
12月 03 17:08:00 local.server-memo.net kernel: intel_rapl: no valid rapl domains found in package 0
12月 03 17:08:00 local.server-memo.net avahi-daemon[715]: WARNING: No NSS support for mDNS detected, consider installing nss-mdns!
12月 03 17:08:00 local.server-memo.net /usr/sbin/irqbalance[723]: Balancing is ineffective on systems with a single cpu.  Shutting down
12月 03 17:08:04 local.server-memo.net NetworkManager[811]: _nl_get_vtable: assertion 'vtable.handle' failed
12月 03 17:08:04 local.server-memo.net snmpd[1382]: Duplicate IPv4 address detected, some interfaces may not be visible in IP-MIB

特定プロセスのログのみ表示

プロセス番号を指定することで、特定のプロセスのログを表示させることができます。

# journalctl _PID=[プロセス番号]

プロセス番号確認

今回は「NetworkManager」のプロセス番号を確認します。

# ps -ef | pgrep NetworkManager
723

プロセス番号が「723」であることが確認できました。

ログの確認

プロセス番号が分かりましたので、それを指定してログを表示させてみます。

# journalctl _PID=723 -n 5
-- Logs begin at Sat 2015-12-05 18:24:18 JST, end at Sat 2015-12-05 19:01:01 JST. --
Dec 05 18:24:28 mc.server-memo.net NetworkManager[723]:   NetworkManager state is now CONNECTED_LOCAL
Dec 05 18:24:28 mc.server-memo.net NetworkManager[723]:   NetworkManager state is now CONNECTED_GLOBAL
Dec 05 18:24:28 mc.server-memo.net NetworkManager[723]:   Policy set 'System eth0' (eth0) as default for IPv4 routing and DNS.
Dec 05 18:24:28 mc.server-memo.net NetworkManager[723]:   (eth0): Activation: successful, device activated.
Dec 05 18:24:31 mc.server-memo.net NetworkManager[723]:   startup complete

特定ユニットのログを表示

「-u」オプションを使用することで、systemdの特定ユニット(サービス)のログを表示させることができます。

# journalctl -u [ユニット名]

下記は「crond」のログを最新から5行分表示させた例です。

# journalctl -u crond -n 5
-- Logs begin at 土 2015-10-17 23:27:04 JST, end at 日 2015-12-06 17:20:01 JST. --
11月 25 22:15:01 local.server-memo.net crond[726]: (root) RELOAD (/var/spool/cron/root)
-- Reboot --
12月 04 10:08:04 local.server-memo.net systemd[1]: Starting Command Scheduler...
12月 04 10:08:04 local.server-memo.net systemd[1]: Started Command Scheduler.
12月 04 10:08:05 local.server-memo.net crond[727]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 8% if used.)
12月 04 10:08:05 local.server-memo.net crond[727]: (CRON) INFO (running with inotify support)

特定ユサービスのログを表示

ログを表示させたいサービスのフルパスを指定することで、そのサービスのログを表示させることができます。

# journalctl [サービスのフルパス]

下記は「snmpd」のログを表示させた例となります。

# journalctl /usr/sbin/snmpd -n 5
-- Logs begin at 土 2015-10-17 23:27:04 JST, end at 日 2015-12-06 17:40:01 JST. --
10月 17 23:27:19 local.server-memo.net snmpd[1346]: NET-SNMP version 5.7.2
11月 22 15:34:57 local.server-memo.net snmpd[1346]: Duplicate IPv4 address detected, some interfaces may not be visible in IP-MIB
-- Reboot --
12月 04 10:08:09 local.server-memo.net snmpd[1353]: Duplicate IPv4 address detected, some interfaces may not be visible in IP-MIB
12月 04 10:08:10 local.server-memo.net snmpd[1353]: NET-SNMP version 5.7.2

日時でフィルタリング

「--since」と「--until」オプションを使用することで、特定の日時によるログのフィルタリングが可能となります。

# journalctl --since="yyyy-mm-dd hh:mm:ss" --until="yyyy-mm-dd hh:mm:ss" 

「--until」「--since」のどちらか片方のみの指定も可能です。

日時の指定は「yyyy-mm-dd hh:mm:ss」形式の他に「today」「yesterday」「tomorrow」[now]などが使えます。

下記は、プライオリティ「notice」レベルで2015年12月6日15:00:00から15:25:00の間のログを表示させた例となります。

# journalctl -p 5 --since="2015-12-06 15:00:00" --until="2015-12-06 15:25:00"
-- Logs begin at 土 2015-10-17 23:27:04 JST, end at 日 2015-12-06 16:10:01 JST. --
12月 06 15:01:01 local.server-memo.net run-parts(/etc/cron.hourly)[58369]: starting 0anacron
12月 06 15:01:01 local.server-memo.net run-parts(/etc/cron.hourly)[58375]: finished 0anacron
12月 06 15:01:01 local.server-memo.net run-parts(/etc/cron.hourly)[58377]: starting 0yum-hourly.cron
12月 06 15:01:01 local.server-memo.net run-parts(/etc/cron.hourly)[58381]: finished 0yum-hourly.cron
12月 06 15:12:24 local.server-memo.net dbus[725]: [system] Activating via systemd: service name='org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher
12月 06 15:12:24 local.server-memo.net dbus[725]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
12月 06 15:12:24 local.server-memo.net nm-dispatcher[59153]: Dispatching action 'dhcp4-change' for eno33554984

ログ(ジャーナル)の保存場所

CentOS7の初期設定では「journald」で保存されるログファイルは「/run/log/journal」ディレクトリ内にログ保存用のディレクトリが作成されて、そこに保存されています。

# ls -laR /run/log/journal/
/run/log/journal/:
合計 0
drwxr-sr-x 3 root systemd-journal  60 10月 17 23:27 .
drwxr-xr-x 3 root root             60 10月 17 23:27 ..
drwxr-sr-x 2 root systemd-journal 120 11月 29 03:15 eecc29390638451fb65c448b18cf02ab

/run/log/journal/eecc29390638451fb65c448b18cf02ab:
合計 57344
drwxr-sr-x 2 root systemd-journal      120 11月 29 03:15 .
drwxr-sr-x 3 root systemd-journal       60 10月 17 23:27 ..
-rw-r----- 1 root systemd-journal 16777216 12月  2 10:05 system.journal
-rw-r----- 1 root root             8388608 10月 17 23:27 system@5f224753a2314b69ac5e7ca7ff389302-0000000000000001-0005224db4ca30b5.journal
-rw-r----- 1 root systemd-journal 16777216 11月 25 19:30 system@5f224753a2314b69ac5e7ca7ff389302-00000000000007c0-0005251b4d350c2c.journal
-rw-r----- 1 root systemd-journal 16777216 11月 29 03:15 system@5f224753a2314b69ac5e7ca7ff389302-00000000000044d9-0005255b02b27f72.journal

「/run」ディレクトリは「tmpfs」にマウントされているため、OSを再起動するとデータがクリアされてログファイルが無くなってしまいます。

# df
ファイルシス            1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/centos-root    47809732 2662952 45146780    6% /
devtmpfs                    1928568       0  1928568    0% /dev
tmpfs                       1937992       0  1937992    0% /dev/shm
tmpfs                       1937992   57888  1880104    3% /run
tmpfs                       1937992       0  1937992    0% /sys/fs/cgroup
/dev/sda1                    508588  234936   273652   47% /boot

ログが削除されないようにするためには?

OSを再起動してもログファイルが削除されないようにするためには、下記のどちらかの方法で可能です。

  • 「/var/log/journal」ディレクトリを作成する場合
  • 「/etc/systemd/journald.conf」を編集

「/var/log/journal」ディレクトリ作成手順

「mkdir」コマンドで「/var/log/journal」ディレクトリを作成した後に、「systemctl」コマンドで「journald」を再起動することで、ログの保存場所が変更されます。

「/var/log/journal」ディレクトリ作成
# mkdir -p /var/log/journal
ログ保存場所の変更

「journald」を再起動することで、ログの保存場所が変更されます。

# systemctl restart systemd-journald

「/var/log/journal を作成する事でログファイルの保存場所が変更される理由ですが、「journald」の設定ファイルである「/etc/systemd/journald.conf」の「Storage」項目の初期設定が「auto」と設定されています。

この「auto」という設定は、「/var/log/journal」ディレクトリがある場合は、そこにログファイルを保存し、ディレクトリがない場合は「/run/log/journal/」ディレクトにログを保存するという設定となるためです。

journald.conf抜粋
[Journal]
#Storage=auto

「#」でコメントされていますが、初期設定が「auto」となっています。

「/etc/systemd/journald.conf」編集の場合

「journald.conf」の「Storage」項目の設定を「persistent 」と設定し、「journald」を再起動することで自動的に「/var/log/journal」ディレクトリを作成しそこにログを保存するようになります。

journald.conf編集

設定ファイルのバックアップをとってから、編集作業を行っていきます。

# cp -p /etc/systemd/journald.conf /etc/systemd/journald.conf_yyyymmdd
# vi /etc/systemd/journald.conf
編集部分

「Storage」項目の設定を「auto」から「persistent」に変更します。

変更前  #Storage=auto
変更後  Storage=persistent

設定反映

「journald」再起動することで設定を反映させることができます。

# systemctl restart systemd-journald

設定確認

「/var/log/journal」ディレクトリを確認すると、ログの保存が始まっていることが確認できます。

# ls -la -R /var/log/journal
/var/log/journal:
合計 4
drwxr-xr-x   3 root root   45 12月 14 14:50 .
drwxr-xr-x. 13 root root 4096 12月 14 14:50 ..
drwxr-xr-x   2 root root   27 12月 14 14:50 eecc29390638451fb65c448b18cf02ab

/var/log/journal/eecc29390638451fb65c448b18cf02ab:
合計 8192
drwxr-xr-x 2 root root      27 12月 14 14:50 .
drwxr-xr-x 3 root root      45 12月 14 14:50 ..
-rw-r----- 1 root root 8388608 12月 14 14:50 system.journal
ログの確認

「journalctl」コマンドで「journald」のログを確認することでも、ログの保存場所が変わったことが確認できます。

「Runtime journal」から「Permanent journal」へ変更や、ログ保存サイズが変更になっていることが分かります。

# journalctl -u systemd-journald -n
-- Logs begin at 月 2015-12-14 14:41:38 JST, end at 月 2015-12-14 14:50:22 JST. --
12月 14 14:41:38 local.server-memo.net systemd-journal[20534]: Runtime journal is using 8.0M (max 189.2M, leaving 283.8M of free 1.8G, current limit 189.2M).
12月 14 14:41:38 local.server-memo.net systemd-journal[20534]: Runtime journal is using 8.0M (max 189.2M, leaving 283.8M of free 1.8G, current limit 189.2M).
12月 14 14:41:38 local.server-memo.net systemd-journal[20534]: Journal started
12月 14 14:41:38 local.server-memo.net systemd-journal[20534]: Runtime journal is using 8.0M (max 189.2M, leaving 283.8M of free 1.8G, current limit 189.2M).
12月 14 14:50:22 local.server-memo.net systemd[1]: Stopping Journal Service...
12月 14 14:50:22 local.server-memo.net systemd-journal[20534]: Journal stopped
12月 14 14:50:22 local.server-memo.net systemd-journal[21317]: Permanent journal is using 8.0M (max 4.0G, leaving 4.0G of free 43.0G, current limit 4.0G).
12月 14 14:50:22 local.server-memo.net systemd-journal[21317]: Permanent journal is using 8.0M (max 4.0G, leaving 4.0G of free 43.0G, current limit 4.0G).
12月 14 14:50:22 local.server-memo.net systemd-journal[21317]: Time spent on flushing to /var is 1.139ms for 38 entries.
12月 14 14:50:22 local.server-memo.net systemd-journal[21317]: Journal started

ログ(ジャーナル)の保存サイズ

初期設定(設定ファイル上では空欄)ではログを保存するディレクトリがマウントされているファイルシステムの10%までログを保存する設定となっています。

ログの最大保存サイズは「journald.conf」の下記項目で設定します。

  • 「/var/log/journal」の保存サイズは「SystemMaxUse」
  • 「/run/log/jornal」の保存サイズは「RuntimeMaxUse」

設定書式

ログのサイズを500Mに設定する場合は、下記のようにサイズを指定して設定します。

/var/log/journalのログ最大容量設定

「/var/log/journal」に保存するログの最大サイズを変更する場合は、「SystemMaxUse」の方に保存するログのサイズを設定します。

SystemMaxUse=500M

/run/log/journalのログ最大容量設定

「/run/log/journal」に保存するログの最大サイズを変更する場合は、「RuntimeMaxUse」に保存するログのサイズを設定します。

RuntimeMaxUse=500M

サイズの単位は「K」(キロ)「M」(メガ)「G」(ギガ)「T」(テラ)「P」(ペタ)「E」(エクサ)等が使用できます。

設定手順

設定ファイル編集

「journald」の設定ファイルである、「/etc/systemd/journald.conf」を編集していきます。

# vi /etc/systemd/journald.conf
設定内容

今回は、「/var/log/journal」に保存するログの最大サイズを「500M」に設定します。

SystemMaxUse=500M

設定反映

設定した内容は、「journald」を再起動することで反映されます。

# systemctl restart systemd-journald

設定確認

「journalctl」コマンドで、現在のログサイズ設定確認ができます。

# journalctl -u systemd-journald -n 2
-- Logs begin at 木 2015-12-03 02:48:09 JST, end at 月 2015-12-14 11:50:01 JST. --
12月 14 11:47:13 local.server-memo.net systemd-journal[6873]: Permanent journal is using 24.0M (max 500.0M, leaving 4.0G of free 43.0G, current limit 500.0M).
12月 14 11:47:13 local.server-memo.net systemd-journal[6873]: Journal started

(max 500.0M, leaving 4.0G of free 43.0G, current limit 500.0M)と表示されているので、「500M」の制限が反映されていることが確認できます。

ちなみに、「SystemKeepFree」と「RuntimeKeepFree」でもログの保存サイズを設定できますが、こちらは「journald」が保存するログ以外のために確保しておくサイズとなります。

こちらは初期設定は15%となっていて、「SystemMaxUse=」「RuntimeMaxUse=」の設定と比べて、サイズが小さい方の設定が有効となります。

現在のログサイズ確認

現在のログサイズは「--disk-usage」オプションを指定することで確認できます。

# journalctl --disk-usage
Journals take up 8.0M on disk.

ログのサイズが「8.0M」あることが確認できました。

 - journald