【2023年1月版】 journalctl 覚えておきたい使い方メモ

# はじめに

すぐに忘れてしまう journalctl の使い方のメモ。
LPIC とか LinuC の範囲。

最新に加筆修正しました。　

　↓
 
[【2024年1月版】中年エンジニアのための systemd メモ 【systemctl, journalctl すぐ忘れてしまう人向け】](https://qiita.com/nouernet/items/736229ac97b0fae940aa)


# journalctl 概要

カーネルや systemd で管理されているサービスは、
殆どの場合、 journald で集められて、rsyslogd で`ログファイル（テキスト）`へ出力が行われている。
/dev/kmsg, /dev/log とかも含めて。
プログラムが直接ログファイルを出力している場合を除いたログ出力、サービス（systemdのunit）の標準出力、エラー出力はjournaldで集められている（[検証](#検証サンプル)を参照）。

journald で集められたデータは、 system.journal という`DB（バイナリ）`に格納されているので、
journalctl で出力する。

systemd-journald ってとめていいのか？ -> とめないほうがいい。

# 主要なオプション

同一オプションを複数指定した場合は `OR条件` になる。
異なるオプションを指定した場合は `AND条件` になる。

- 全体を昇順

    `journalctl`

  　
- 全体を降順

  `journalctl -r`
  `journalctl --reverse`

  　
- 直近(1000行)をページャで表示

  `journalctl -e`
  `journalctl --pager-end`
  　

- 最後からn行を表示

  `journalctl -n`
  `journalctl --lines`
  `journalctl -n 100 #100行表示`
  　

- リアルタイムで表示

  `journalctl -f`
  `journalctl --follow`
  　

- カーネルログの表示

  `journalctl -k`
  `journalctl --dmesg`
  　

- サービス名（sysmtemd unit）でフィルタ

  `journalctl -u [サービス名]`
  `journalctl --unit [サービス名]`
  `journalctl _SYSTEMD_UNIT [サービス名]`
  `journalctl -u sshd`
  `journalctl -u ssh* #*でワイルドカード指定できる`
  　

- 特定プライオリティ以上でフィルタ

  `journalctl -p [プライオリティ]`
  `journalctl --priority [プライオリティ]`
  `journalctl -p err`
  `journalctl -p 3`
  　

- 時間でフィルタ

  - since
    
    `journalctl --since=[時間]`
    `journalctl --since="2023-01-29 07:00:00"`
  　

  - until

    `journalctl --until=[時間]`
    `journalctl --until="2023-01-29 07:00:00"`
  　

- プロセスIDでフィルタ

  `journalctl _PID=[PID]`
  　

- ユーザIDでフィルタ

  `journalctl _UID=[UID]`
  　

- コマンド名でフィルタ

  `journalctl [コマンドパス]`
  `journalctl /usr/sbin/crond`
  　

- pager表示をやめる（grepにわたす場合など)

  `journalctl --no-pager`
  　

- 説明テキストを追加表示

  `journalctl -x`
  `journalctl --catalog`
  　

- ブート時のメッセージを表示

  `journalctl -b #今回のブート時のメッセージを表示`
  `journalctl --boot`
  `journalctl -b -2  #2回前のブート時のメッセージを表示`
  　
- システム監視でよく使う、今回ブートからエラーをタイムスタンプの降順で表示

  `journalctl -rp err -b`
  　
# その他ログ周り

## rsyslog

- 時間ができたら記述

## logger

- 時間ができたら記述

## systemd-cat

- 時間ができたら記述

## logrotate

- 時間ができたら記述

# 検証サンプル

- journald で集められているサンプル

```terminal
$ cat test.sh
#!/bin/bash

echo "Standard Output!"
echo "Standard Error!" >&2

$ chmod +x test.sh
$ sudo systemd-run ./test.sh
Running as unit: run-r9545bbf073f94430b60cfee25049eee3.service
$ journalctl -u run-r9545bbf073f94430b60cfee25049eee3.service
-- Logs begin at Sun 2023-01-29 21:12:14 JST, end at Sun 2023-01-29 21:58:43 JST. --
Jan 29 21:57:32 ubuntu systemd[1]: Started /home/dev/./test.sh.
Jan 29 21:57:32 ubuntu test.sh[519211]: Standard Output!
Jan 29 21:57:32 ubuntu test.sh[519211]: Standard Error!
Jan 29 21:57:32 ubuntu systemd[1]: run-r9545bbf073f94430b60cfee25049eee3.service: Succeeded.
```

- journald から rsyslog へ転送する設定

```terminal
$ cat /etc/systemd/journald.conf
 :
 :
#ForwardToSyslog=yes
 :
 :
#MaxLevelSyslog=debug
 :
 :
```

- どこで出力されたのか詳細を確認

```
$ journalctl -u run-r9545bbf073f94430b60cfee25049eee3.service --no-pager -o verbose
 :
 :
    _TRANSPORT=journal
 :
 :
    MESSAGE=Started /home/dev/./test.sh.
 :
 :
    _TRANSPORT=stdout
 :
 :
    MESSAGE=Standard Output!
 :
 :
    _TRANSPORT=stdout
 :
 :
    MESSAGE=Standard Error!
 :
 :
    _TRANSPORT=journal
 :
 :
    MESSAGE=run-r9545bbf073f94430b60cfee25049eee3.service: Succeeded.
 :
 :
```
# 参考

[gihyo.jp - Ubuntu Weekly Recipe 第546回 journaldとsyslogの関係](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0546)

# さいごに

わすれたくない