journaldってなに？

## 勉強前イメージ

serviceコマンドでミドルウェアの起動に失敗したときに出てくるイメージ
systemdとかのログをになってるのかな？

## 調査

### journaldとは？

正式名称は `systemd-journald.service`
systemdの環境で標準的に提供されるログ管理のサービスになります。

以下のようにsystemdのデーモンプロセスとして稼働しています。

```sh
[root@localhost ~]# systemctl status systemd-journald.service
● systemd-journald.service - Journal Service
   Loaded: loaded (/usr/lib/systemd/system/systemd-journald.service; static; vendor preset: disabled)
   Active: active (running) since 火 2020-12-08 12:13:43 JST; 1 day 8h ago
     Docs: man:systemd-journald.service(8)
           man:journald.conf(5)
 Main PID: 18223 (systemd-journal)
   Status: "Processing requests..."
   CGroup: /system.slice/systemd-journald.service
           └─18223 /usr/lib/systemd/systemd-journald

12月 08 12:13:43 localhost.localdomain systemd-journal[18223]: Runtime journal is using 80.0M (max …M).
12月 08 12:13:43 localhost.localdomain systemd-journal[18223]: Journal started
Hint: Some lines were ellipsized, use -l to show in full.
```

CentOS7の環境には journaldの他、CentOS7より前から使用されている `rsyslog` も稼働しています
`/var/log/messages` などはrsyslogが管理し、
その他のプロセスやサービスのログは独自のDBに保存しています。

流れとしては以下の画像のように、
systemdユニットプロセスやその他の一般プロセスのログをjournaldに収集し、
syslogメッセージはrsyslogにも転送されます。

![journaldUntitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/3acf0518-4d28-e1cd-1eb2-8cac1907b845.png)

rsyslogに関しても、以下のようにjournaldと同様 systemdのデーモンプロセスとして動いています。

```sh
[root@localhost ~]# systemctl status rsyslog.service
● rsyslog.service - System Logging Service
   Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
   Active: active (running) since 月 2020-11-30 21:32:01 JST; 1 weeks 1 days ago
     Docs: man:rsyslogd(8)
           http://www.rsyslog.com/doc/
 Main PID: 1130 (rsyslogd)
   CGroup: /system.slice/rsyslog.service
           └─1130 /usr/sbin/rsyslogd -n

12月 02 09:04:31 localhost.localdomain rsyslogd[1130]: imjournal: journal reloaded... [v8.24.0-52.... ]
12月 02 10:28:05 localhost.localdomain rsyslogd[1130]: imjournal: journal reloaded... [v8.24.0-52.... ]
12月 02 12:27:05 localhost.localdomain rsyslogd[1130]: imjournal: journal reloaded... [v8.24.0-52.... ]
12月 02 12:51:13 localhost.localdomain rsyslogd[1130]: imjournal: journal reloaded... [v8.24.0-52.... ]
12月 02 14:38:01 localhost.localdomain rsyslogd[1130]: imjournal: journal reloaded... [v8.24.0-52.... ]
12月 02 16:08:43 localhost.localdomain rsyslogd[1130]: imjournal: journal reloaded... [v8.24.0-52.... ]
12月 03 10:32:01 localhost.localdomain rsyslogd[1130]:  [origin software="rsyslogd" swVersion="8.2...ed
12月 03 19:11:22 localhost.localdomain rsyslogd[1130]: imjournal: journal reloaded... [v8.24.0-52.... ]
12月 03 19:49:26 localhost.localdomain rsyslogd[1130]: imjournal: journal reloaded... [v8.24.0-52.... ]
12月 08 12:13:43 localhost.localdomain rsyslogd[1130]: imjournal: journal reloaded... [v8.24.0-52.... ]
Hint: Some lines were ellipsized, use -l to show in full.
```

### journaldのログを見るためには・・・？

- ファイルを見る

CentOS7のデフォルトでは `/var/run/log/journal` にログが吐かれています。
ここはOSを再起動すると消えるので、直近の起動ログのみ。
吐いたログを見てみようと思いましたが、バイナリファイルでした

```
[root@localhost ~]# ll /var/run/log/journal/011cccd3dfdde94b92dced6372b08bda/*
-rw-r-----+ 1 root systemd-journal 8388608 12月  9 20:32 /var/run/log/journal/011cccd3dfdde94b92dced6372b08bda/system.journal
-rwxr-x---+ 1 root systemd-journal 8388608 12月  1 21:27 /var/run/log/journal/011cccd3dfdde94b92dced6372b08bda/system@0005b56ffcd43e6a-bcfd007e9c017b9f.journal~
-rw-r-----+ 1 root systemd-journal 8388608 12月  2 10:24 /var/run/log/journal/011cccd3dfdde94b92dced6372b08bda/system@0005b57127b6b01a-434f3f1eaaca813a.journal~
-rw-r-----+ 1 root systemd-journal 8388608 12月  2 12:22 /var/run/log/journal/011cccd3dfdde94b92dced6372b08bda/system@0005b572d13f953c-8ad654dfd105654d.journal~
-rw-r-----+ 1 root systemd-journal 8388608 12月  2 12:48 /var/run/log/journal/011cccd3dfdde94b92dced6372b08bda/system@0005b57327933169-6600573119c92485.journal~
-rw-r-----+ 1 root systemd-journal 8388608 12月  2 14:35 /var/run/log/journal/011cccd3dfdde94b92dced6372b08bda/system@0005b574a58eaa7f-44afe00ad80ed8d3.journal~
-rw-r-----+ 1 root systemd-journal 8388608 12月  2 16:04 /var/run/log/journal/011cccd3dfdde94b92dced6372b08bda/system@0005b575e9e49a9e-7fa8897feb5ea35d.journal~
-rw-r-----+ 1 root systemd-journal 8388608 12月  3 18:01 /var/run/log/journal/011cccd3dfdde94b92dced6372b08bda/system@0005b58c94f7a24a-c27750ddf7df5a78.journal~
-rw-r-----+ 1 root systemd-journal 8388608 12月  3 19:12 /var/run/log/journal/011cccd3dfdde94b92dced6372b08bda/system@0005b58d1d143f09-0e72be4e963eb3e7.journal~
-rw-r-----+ 1 root systemd-journal 8388608 12月  8 12:02 /var/run/log/journal/011cccd3dfdde94b92dced6372b08bda/system@0005b5eb548053ae-2a5c77cc30eabb16.journal~

[root@localhost ~]# head /var/run/log/journal/011cccd3dfdde94b92dced6372b08bda/system.journal 
LPKSHHRH�Qs���L���S�z�!������cr���ilBDϛ���i"d��Qs���L���S�z�!��
�� �
C��T�i{�j�֚%4
�
��
��
��
��
�
�
```

永続的にログを保存したい場合は `/var/log/journal` を作って再起動するとこちらにログを保存するようになります。
試しに作ってrebootしたらきちんとログが保存されていました。
無制限にログを貯めるわけではなく、古くなったり容量が少なくなったら消していくようです。

```
[root@localhost ~]# mkdir /var/log/journal
[root@localhost ~]# reboot
...
[root@localhost ~]# ll /var/log/journal/*
合計 16384
-rw-r-----+ 1 root systemd-journal 8388608 12月  9 21:00 system.journal
-rw-r-----  1 root root            8388608 12月  9 20:59 system@540f5dd2506e42528b408a6bbe8b12de-0000000000000001-0005ae278017b960.journal
```

- コマンドで見る

`journalctl` コマンドで見ることが出来ます。
叩いてみたら以下のようにずらずら出てきます


```
[root@localhost ~]# journalctl
 8月 31 16:39:19 localhost.localdomain systemd-journal[92]: Runtime journal is using 8.0M (max allowed 9
 8月 31 16:39:19 localhost.localdomain kernel: Initializing cgroup subsys cpuset
 8月 31 16:39:19 localhost.localdomain kernel: Initializing cgroup subsys cpu
 8月 31 16:39:19 localhost.localdomain kernel: Initializing cgroup subsys cpuacct
 8月 31 16:39:19 localhost.localdomain kernel: Linux version 3.10.0-1160.6.1.el7.x86_64 (mockbuild@kbuil
 8月 31 16:39:19 localhost.localdomain kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-1160.6.1.el7.x86
 8月 31 16:39:19 localhost.localdomain kernel: e820: BIOS-provided physical RAM map:
....
```

試しにhttpdのサービスのログを見てみます。
オプションで `-u xxxx.service` とつければ特定のサービスのログを見ることが出来ます

```
[root@localhost ~]# journalctl -u httpd.service
-- Logs begin at 月 2020-08-31 16:39:19 JST, end at 水 2020-12-09 21:04:23 JST. --
12月 09 21:04:23 localhost systemd[1]: Starting The Apache HTTP Server...
12月 09 21:04:23 localhost httpd[1566]: AH00558: httpd: Could not reliably determine the server's fully
12月 09 21:04:23 localhost systemd[1]: Started The Apache HTTP Server.
```

### 補足

多分journaldの中身って `systemctl status httpd` 叩いた時に下に出てくるログと同様な気がします。

```
[root@localhost ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 水 2020-12-09 21:04:23 JST; 2min 8s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 1566 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─1566 /usr/sbin/httpd -DFOREGROUND
           ├─1567 /usr/sbin/httpd -DFOREGROUND
           ├─1568 /usr/sbin/httpd -DFOREGROUND
           ├─1569 /usr/sbin/httpd -DFOREGROUND
           ├─1570 /usr/sbin/httpd -DFOREGROUND
           └─1571 /usr/sbin/httpd -DFOREGROUND

12月 09 21:04:23 localhost systemd[1]: Starting The Apache HTTP Server...
12月 09 21:04:23 localhost httpd[1566]: AH00558: httpd: Could not reliably determine the server...sage
12月 09 21:04:23 localhost systemd[1]: Started The Apache HTT
```

サービスの起動を失敗させてみました。
よくよくみたら、 `"systemctl status httpd.service"` をして、詳細は `"journalctl -xe"` で見ろよって言ってるので
あながち間違ってはなさそうですね。

```
[root@localhost ~]# systemctl restart httpd
Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
```

## 勉強後イメージ

今まで気にせずにサービス起動失敗したときとかjournalctl叩いてたけど、どういう役割してるとか全然気にしたことなかったかも....
元々rsyslogがこの役割をしてたりしたのかな？
経緯は今度調べてみよう。


## 参考

- [CentOSのログ出力の仕組み (journaldとrsyslog)](https://densan-hoshigumi.com/server/centos-logging)
- [第56回　RHEL7/CentOS7のjournaldでシステムログを一元管理 (中井悦司)](https://www.school.ctc-g.co.jp/columns/nakai/nakai56.html)
- [journal ログをきちんと記録・保存する](https://qiita.com/thaim/items/5d0cc595fce4ac0858e4)
- [RHEL7/CentOS7のjournaldについてのもろもろ](https://enakai00.hatenablog.com/entry/20141130/1417310904)