ウェブサイト検索

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

役立つ記事をぜひチェックしてください。

  1. システム起動プロセスとサービスの管理 (SysVinit、Systemd、および Upstart)
  2. Petiti – Linux システム管理者用のオープンソース ログ分析ツール
  3. Linux で Logrotate を使用してログ ローテーションを設定および管理する方法
  4. lnav – Linux ターミナルから Apache ログを監視および分析する

今のところは以上です。このトピックについて質問したり、意見を追加したりするには、以下のフィードバックを使用してください。