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またはさまざまなアプリケーションからのメッセージであり、すべてのメッセージを中央の場所であるジャーナルファイルに保存します。

ジャーナルの動作は、コンパイル時に生成されるデフォルトの構成ファイル/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やLinuxMintなどの派生物を含む多くのLinuxディストリビューションでは、デフォルトでブートメッセージをディスクに永続的に保存することはできません。

以下に示すように、「ストレージ」オプションを「永続的」に設定することで、これを有効にすることができます。これにより、/ var/log/journalディレクトリが作成され、すべてのジャーナルファイルがその下に保存されます。

$ sudo vi /etc/systemd/journald.conf 
OR
$ sudo nano /etc/systemd/journald.conf 
[Journal]
Storage=persistent

追加の設定については、「[ジャーナル]」セクションで構成されているはずのすべてのオプションの意味を入力して見つけてください。

$ man journald.conf

ジャーナルサービスを使用した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は、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 ([email protected])
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

前回の起動時のジャーナルを表示するには、以下のように -b オプションを指定して -1 相対ポインターを使用します。

$ 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を指定します。

$ 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– emerg、1 – alert、2 – crit、3 – err、4 – warning、5 – Notice、6 – info、7 – debug):

$ journalctl -p err

範囲を指定するには、以下の形式を使用します(emergからwarning)。

$ 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(manページでオプションの意味を確認してください:

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/[email protected]9866c3d4d.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/[email protected]5d8945a9e.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/[email protected]1becab02f.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/[email protected]01cfcedff.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. Managing System Startup Process and Services (SysVinit, Systemd and Upstart)
  2. Petiti – An Open Source Log Analysis Tool for Linux SysAdmins
  3. How to Setup and Manage Log Rotation Using Logrotate in Linux
  4. lnav – Watch and Analyze Apache Logs from a Linux Terminal

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