サービスが落ちた原因を調べようと思ったら、再起動する前のログが journalctl で見られへん
【疑問】再起動したら journalctl のログが消えた。絞り込み・永続化・サイズ・古いログの削除と systemd-cat【LPICレベル1】
前提のおさらい。rsyslog はファシリティとプライオリティで分けて、テキストのファイルにログを書く。systemd のシステムには、それとは別に systemd-journald がいる
>>1
journald の保存先が、メモリ上の /run/log/journal になってると、再起動で消える
/var/log/journal に保存されてれば残る。どっちになるかは /etc/systemd/journald.conf の Storage=
>>3
Storage= の値は?
>>4
volatile:メモリだけ(/run/log/journal)
persistent:ディスク(/var/log/journal、なければ作る)
auto:/var/log/journal があれば persistent、なければ volatile。既定は auto
none:保存しない
つまり auto なら mkdir /var/log/journal して journald を再起動するだけで残るようになる
>>5
試したマシンは /var/log/journal はあるけど、journald が動いてないコンテナでジャーナルのファイルは1つもなかった。journalctl --disk-usage は 0B やった
絞り込みのやり方を教えて
>>7-u ユニット:そのサービスのログ(journalctl -u ssh.service)-p err:err 以上(番号なら -p 3)-b:今回の起動から、-b -1:1つ前の起動。起動の一覧は --list-boots--since と --until:時間(--since "1 hour ago"、--since today など)-k:カーネルのメッセージ(dmesg と同じもの)
>>8
重ねられるんか。journalctl -u ssh.service -p err -b -1 で、前の起動の ssh のエラー以上
>>8
ほかによう使うのは?
>>10
-f で増えていくのを見続ける(tail -f と同じ)、-n 20 で最後の20件、-r で新しい順、-o verbose や -o json で出力の形、-x で説明を付ける、-g で中身を正規表現で探す_PID=1234 や _UID=1000 のようにフィールドで絞ることもできる
>>8
journalctl は全部が見られるん?
>>12
一般ユーザーは自分のログだけ。全部見るには root か、systemd-journal グループ(Debian では adm も)に入る
>>3
ずっと溜めたらディスクがいっぱいにならん?
>>14
journald.conf の SystemMaxUse= で上限を決められる。既定はファイルシステムの10%で、4G まで(journald.conf の man)
たとえば 32G のファイルシステムなら
が上限
>>15
手で減らすなら?
>>16journalctl --vacuum-size=500M(その大きさまで減らす)、--vacuum-time=2weeks(それより古いのを消す)、--vacuum-files=5(ファイルの数)
テキストのログみたいに rm で消すもんやない。logrotate の代わりは journald 自身がやってる
壊れたマシンのディスクを別のマシンにつないで、そのログを読みたい
>>18journalctl -D /mnt/var/log/journal でディレクトリを指定する。1つのファイルなら --file。試したら、空のディレクトリでは No journal files were found. と出た
>>2
スクリプトの出力を journal に入れたい
>>20
systemd-cat。systemd-cat -t backup -p warning /usr/local/bin/backup.sh でコマンドの出力を、タグ backup、プライオリティ warning で journal に送る。echo hi | systemd-cat みたいにパイプでも使える
logger でも journal に入る(journald が /dev/log を受けてるから)
>>3
rsyslog と両方使うこともあるん?
>>22
ある。journald が受けたものを rsyslog にも渡して(ForwardToSyslog= や rsyslog の imjournal)、テキストのファイルにも残す構成。Red Hat 系はこの形が多い
>>5
/var/log/journal があるかと Storage= で残るかが決まる、-u -p -b で絞る、減らすのは --vacuum、別のディスクは -D。前の起動のログが消えたのは volatile やったからか
管理人のひとこと
- systemd-journald の保存先は Storage=(/etc/systemd/journald.conf):volatile は /run/log/journal(再起動で消える)、persistent は /var/log/journal、auto(既定)は /var/log/journal があれば永続、none は保存しない。
- journalctl の絞り込み:-u ユニット、-p プライオリティ(err 以上など)、-b(今回)・-b -1(前回)・--list-boots、--since・--until、-k(カーネル)、-f、-n、-r、-o、-g、
_PID=などのフィールド。全部見るには root か systemd-journal グループ。 - サイズは SystemMaxUse=(既定はファイルシステムの10%、4G まで)。削除は --vacuum-size・--vacuum-time・--vacuum-files。使用量は --disk-usage。
- 別のシステムのログは -D ディレクトリ や --file。systemd-cat でコマンドの出力を journal に送る(-t タグ、-p プライオリティ)。rsyslog への転送もできる(ForwardToSyslog=、imjournal)。