Journalctl を使用して Systemd でログ メッセージを管理する [総合ガイド]
Systemd は、Linux システム用の最先端のシステムおよびサービス マネージャーです。システムの起動時にプロセスを並行して開始することを目的とした init デーモンの代替品です。現在、Fedora、Debian、Ubuntu、OpenSuSE、Arch、RHEL、CentOS などの多くの現在の主流ディストリビューションでサポートされています。
先ほど、「init」と「systemd」の背後にあるストーリーについて説明しました。ここでは、2 つのデーモンとは何か、なぜ「init」を技術的に「systemd」に置き換える必要があるのか、また systemd の主な機能について説明しました。
他の一般的な init システムに対する systemd の主な利点の 1 つは、ジャーナルを使用したシステムおよびプロセスのログの集中管理のサポートです。この記事では、Linux のjournalctl コマンドを使用して、systemd でログ メッセージを管理および表示する方法を学びます。
重要: このガイドをさらに進める前に、「Systemctl」コマンドを使用して「Systemd」サービスとユニットを管理する方法、および新しいサービスを作成して実行する方法を学習することをお勧めします。 Linux のシェル スクリプトを使用した systemd のサービス ユニット。ただし、上記のすべてに問題がない場合は、読み続けてください。
Systemd でログ メッセージを収集するための Journald の構成
journald は、システム全体からジャーナル エントリを収集して書き込むデーモンです。これらは基本的にブート メッセージ、カーネル、syslog、またはさまざまなアプリケーションからのメッセージであり、すべてのメッセージが中央の場所 (ジャーナル ファイル) に保存されます。
journald の動作は、コンパイル時に生成されるデフォルト設定ファイル /etc/systemd/journald.conf を介して制御できます。このファイルには、ローカル環境の要件に合わせて値を変更できるオプションが含まれています。
以下は、cat コマンドを使用して表示されたファイルの例です。
cat /etc/systemd/journald.conf
See journald.conf(5) for details.
[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
さまざまなパッケージのインストールと使用の構成抽出は /usr/lib/systemd/*.conf.d/ にあり、実行時の構成は /run/systemd/journald.conf にあることに注意してください。 d/*.conf は、必ずしも使用できるわけではありません。
ディスク上のジャーナル データ ストレージを有効にする
Ubuntu やその派生版 (Linux Mint など) を含む多くの Linux ディストリビューションでは、デフォルトではディスク上にブート メッセージを永続的に保存できません。
以下に示すように、「ストレージ」オプションを「永続的」に設定することでこれを有効にすることができます。これにより、/var/log/journal ディレクトリが作成され、すべてのジャーナル ファイルがその下に保存されます。
sudo vi /etc/systemd/journald.conf
OR
sudo nano /etc/systemd/journald.conf
[Journal]
Storage=persistent
追加の設定については、「[ジャーナル]」 セクションで構成する必要があるすべてのオプションの意味を入力して確認します。
man journald.conf
Timedatectl コマンドを使用して正しいシステム時刻を設定する
Journald サービスを使用して systemd で信頼性の高いログ管理を行うには、タイムゾーンを含む時刻設定がシステム上で正しいことを確認してください。
システムの現在の日付と時刻の設定を表示するには、次のように入力します。
timedatectl
OR
timedatectl status
Local time: Thu 2017-06-15 13:29:09 EAT
Universal time: Thu 2017-06-15 10:29:09 UTC
RTC time: Thu 2017-06-15 10:29:09
Time zone: Africa/Kampala (EAT, +0300)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
正しいタイムゾーンと場合によってはシステム時間を設定するには、以下のコマンドを使用します。
sudo timedatectl set-timezone Africa/Kampala
sudo timedatectl set-time “13:50:00”
Journalctl コマンドを使用したログ メッセージの表示
journalctl は、systemd ジャーナル (journald サービスによって書き込まれる) の内容を表示するために使用されるユーティリティです。
収集されたすべてのログをフィルタリングせずに表示するには、次のように入力します。
journalctl
-- Logs begin at Wed 2017-06-14 21:56:43 EAT, end at Thu 2017-06-15 12:28:19 EAT
Jun 14 21:56:43 tecmint systemd-journald[336]: Runtime journal (/run/log/journal
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuset
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpu
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuacct
Jun 14 21:56:43 tecmint kernel: Linux version 4.4.0-21-generic (buildd@lgw01-21)
Jun 14 21:56:43 tecmint kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-
Jun 14 21:56:43 tecmint kernel: KERNEL supported cpus:
Jun 14 21:56:43 tecmint kernel: Intel GenuineIntel
Jun 14 21:56:43 tecmint kernel: AMD AuthenticAMD
Jun 14 21:56:43 tecmint kernel: Centaur CentaurHauls
Jun 14 21:56:43 tecmint kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x01: 'x87 flo
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x02: 'SSE reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x04: 'AVX reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Enabled xstate features 0x7, context si
Jun 14 21:56:43 tecmint kernel: x86/fpu: Using 'eager' FPU context switches.
Jun 14 21:56:43 tecmint kernel: e820: BIOS-provided physical RAM map:
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000000000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000090000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000100000-0x000000001ff
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020000000-0x00000000201
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020200000-0x00000000400
ブーツに基づいてログ メッセージを表示する
--list-boots
オプションを使用すると、ブート番号 (現在のブートに相対)、その ID、およびブートに対応する最初と最後のメッセージのタイムスタンプのリストを表示できます。
journalctl --list-boots
-1 9fb590b48e1242f58c2579defdbbddc9 Thu 2017-06-15 16:43:36 EAT—Thu 2017-06-15 1
0 464ae35c6e264a4ca087949936be434a Thu 2017-06-15 16:47:36 EAT—Thu 2017-06-15 1
現在のブート (番号 0) からのジャーナル エントリを表示するには、次のように -b
スイッチを使用します (上記のサンプル出力と同じ)。
journalctl -b
前回のブートのジャーナルを表示するには、以下のように -1
相対ポインタを -b
オプションとともに使用します。
journalctl -b -1
あるいは、次のようにブート ID を使用します。
journalctl -b 9fb590b48e1242f58c2579defdbbddc9
時間に基づいたログメッセージのフィルタリング
協定世界時 (UTC) 形式で時刻を使用するには、次のように --utc
オプションを追加します。
journalctl --utc
特定の日時以降のすべてのエントリを表示するには、例: 2017 年 6 月 15 日午前 8 時 15 分に、次のコマンドを入力します。
journalctl --since "2017-06-15 08:15:00"
journalctl --since today
journalctl --since yesterday
最近のログメッセージの表示
最近のログ メッセージ (デフォルトでは 10 件) を表示するには、以下に示すように -n
フラグを使用します。
journalctl -n
journalctl -n 20
カーネルによって生成されたログ メッセージの表示
dmesg コマンドの出力と同様に、カーネル メッセージのみを表示するには、-k
フラグを使用できます。
journalctl -k
journalctl -k -b
journalctl -k -b 9fb590b48e1242f58c2579defdbbddc9
ユニットによって生成されたログ メッセージの表示
特定のユニットのすべてのジャーナル エントリを表示するには、次のように -u
スイッチを使用します。
journalctl -u apache2.service
現在のブートをゼロダウンするには、次のコマンドを入力します。
journalctl -b -u apache2.service
前回のブートのログを表示するには、これを使用します。
journalctl -b -1 -u apache2.service
以下にその他の便利なコマンドをいくつか示します。
journalctl -u apache2.service
journalctl -u apache2.service --since today
journalctl -u apache2.service -u nagios.service --since yesterday
プロセスによって生成されたログ メッセージの表示
特定のプロセスによって生成されたログを表示するには、次のように PID を指定します。
journalctl _PID=19487
journalctl _PID=19487 --since today
journalctl _PID=19487 --since yesterday
ユーザーまたはグループ ID によって生成されたログ メッセージの表示
特定のユーザーまたはグループによって生成されたログを表示するには、次のようにユーザーまたはグループ ID を指定します。
journalctl _UID=1000
journalctl _UID=1000 --since today
journalctl _UID=1000 -b -1 --since today
ファイルによって生成されたログの表示
D-Bus 実行可能ファイルや bash 実行可能ファイルなどのファイル (実行可能ファイルの可能性があります) によって生成されたすべてのログを表示するには、単に次のように入力します。
journalctl /usr/bin/dbus-daemon
journalctl /usr/bin/bash
ログメッセージを優先度ごとに表示する
-p
フラグを使用して、メッセージの優先順位または優先順位の範囲に基づいて出力をフィルター処理することもできます。可能な値は次のとおりです: 0 – 緊急、1 – アラート、2 – クリティカル、3 – エラー、4 – 警告、5 – 通知、6 – 情報、7 – デバッグ):
journalctl -p err
範囲を指定するには、次の形式を使用します(緊急から警告まで)。
journalctl -p 1..4
OR
journalctl -p emerg..warning
ログメッセージをリアルタイムで表示する
実際には、-f
オプション (tail -f 機能と同様) を使用して、ログの書き込みを監視できます。
journalctl -f
仕訳帳の表示フォーマットの処理
ジャーナルエントリの出力形式を制御したい場合は、-o
フラグを追加し、次のオプションを使用します: cat、export、json、json-pretty、json-sse、short、short-iso、 short-monotonic、short-precise、verbose(マニュアルページでオプションの意味を確認してください:
cat オプションは、メタデータ (タイムスタンプなど) なしで各ジャーナル エントリの実際のメッセージを表示します。
journalctl -b -u apache2.service -o cat
システム上の仕訳帳の管理
ジャーナル ファイルの内部整合性をチェックするには、--verify
オプションを使用します。すべてが正常であれば、出力は PASS を示すはずです。
journalctl --verify
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system.journal
491f68: Unused data (entry_offset==0)
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000003184-000551f9866c3d4d.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000001fc8-000551f5d8945a9e.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000d4f-000551f1becab02f.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000001-000551f01cfcedff.journal
古いジャーナルファイルの削除
--disk-usage
オプションを使用して、すべてのジャーナル ファイルの現在のディスク使用量を表示することもできます。すべてのアーカイブされたアクティブなジャーナル ファイルのディスク使用量の合計が表示されます。
journalctl --disk-usage
古い (アーカイブされた) ジャーナル ファイルを削除するには、以下のコマンドを実行します。
sudo journalctl --vacuum-size=50M #delete files until the disk space they use falls below the specified size
sudo journalctl --vacuum-time=1years #delete files so that all journal files contain no data older than the specified timespan
sudo journalctl --vacuum-files=4 #delete files so that no more than the specified number of separate journal files remain in storage location
ジャーナルファイルのローテーション
最後になりましたが、--rotate
オプションを使用してジャーナル ファイルをローテーションするようにjournaldに指示できます。このディレクティブは、回転操作が完了するまで返されないことに注意してください。
sudo journalctl --rotate
詳細な使用ガイドとオプションについては、次のようにjournalctlのマニュアルページを参照してください。
man journalctl
役立つ記事をぜひチェックしてください。
- システム起動プロセスとサービスの管理 (SysVinit、Systemd、および Upstart)
- Petiti – Linux システム管理者用のオープンソース ログ分析ツール
- Linux で Logrotate を使用してログ ローテーションを設定および管理する方法
- lnav – Linux ターミナルから Apache ログを監視および分析する
今のところは以上です。このトピックについて質問したり、意見を追加したりするには、以下のフィードバックを使用してください。