それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

journalctlで指定のサービス(ユニット)のログを上手に見る方法-期間指定,サービス指定,json

systemd の status の結果で、ログもうちょっと多く見たい

takuya@:mysql$ systemctl  status nginx
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-07-23 13:52:28 JST; 41min ago
     Docs: man:nginx(8)
 Main PID: 15612 (nginx)
    Tasks: 10 (limit: 4915)
   Memory: 26.1M
      CPU: 1.534s
   CGroup: /system.slice/nginx.service
           ├─15612 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           ├─15613 nginx: worker process
           ├─15619 nginx: worker process
           └─15621 nginx: cache manager process

 7月 23 13:52:28 acid systemd[1]: Starting A high performance web server and a reverse proxy server...
 7月 23 13:52:28 acid systemd[1]: Started A high performance web server and a reverse proxy server.
## ここをもっと見たい

status で、末尾に表示されるログは最新のプロセス起動後のログだけなので、過去の再起動時のプロセスもあわせて見たいと思いますよね。

journalctl -u で見れます。

journalctl -u nginx.service

または service を省略しても見られます。

journalctl -u nginx

tailf / tail -f 的なことがやりたい

tailf / tail -f みたいにログをフォローして表示したい

journalctl -f

これが便利。/var/log/ を探さなくていいんです。楽

その他のオプション

今日のログを見たい --since today をつければ見れる。

takuya@:nginx$ journalctl -u nginx  --since today
-- Logs begin at Tue 2018-05-29 01:08:01 JST, end at Mon 2018-07-23 14:36:01 JST. --
 7月 23 13:51:53 acid systemd[1]: Stopping A high performance web server and a reverse proxy server...
 7月 23 13:51:53 acid systemd[1]: Stopped A high performance web server and a reverse proxy server.
 7月 23 13:52:28 acid systemd[1]: Starting A high performance web server and a reverse proxy server...
 7月 23 13:52:28 acid systemd[1]: Started A high performance web server and a reverse proxy server.

date で解釈できるものなら何でも行けそう

journalctl -u nginx  --since 2018-06-01
journalctl -u nginx  --since yesterday 
journalctl -u nginx  --since '3 days ago'
journalctl -u nginx  --since '3 hours ago'

since と until を組み合わせて期間

since と似たようなものに until があります。

since / until と組み合わせて、ログの表示期間を指定することができる。

json でくれ

-o json-pretty をつければ json でみれるぜ

journalctl -u nginx  --since 'today' -o json-pretty
{
        "__CURSOR" : "s=0997617705f94f34ae01266fa219a576;i=550fb9;b=2bf63364741441b1a80057285897e9b8;m=9ae801170e;t=571a3677f43ab;x=294ec4728d5abe08",
        "__REALTIME_TIMESTAMP" : "1532321513554859",
        "__MONOTONIC_TIMESTAMP" : "665317349134",
        "_BOOT_ID" : "2bf63364741441b1a80057285897e9b8",
        "_MACHINE_ID" : "19458862819a493f879c4a7d4730c653",
        "_HOSTNAME" : "acid",
        "PRIORITY" : "6",
        "SYSLOG_FACILITY" : "3",
        "SYSLOG_IDENTIFIER" : "systemd",
        "_UID" : "0",
        "_GID" : "0",
        "_TRANSPORT" : "journal",
        "_CAP_EFFECTIVE" : "3fffffffff",
        "CODE_FILE" : "../src/core/unit.c",
        "CODE_LINE" : "1493",
        "CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading",
        "_PID" : "1",
        "_COMM" : "systemd",
        "_EXE" : "/lib/systemd/systemd",
        "_CMDLINE" : "/sbin/init",
        "_SYSTEMD_CGROUP" : "/init.scope",
        "_SYSTEMD_UNIT" : "init.scope",
        "_SYSTEMD_SLICE" : "-.slice",
        "UNIT" : "nginx.service",
        "MESSAGE_ID" : "de5b426a63be47a7b6ac3eaac82e2f6f",
        "MESSAGE" : "Stopping A high performance web server and a reverse proxy server...",
        "_SOURCE_REALTIME_TIMESTAMP" : "1532321513554828"
}

他のフィルタ方法

その他にも

_PID=8088 として プロセスIDごとで見たり

_UID=108 として UID ごとで見たり

--no-pagerページャーを無効にしたり

でも、これってgrep である程度できるので特に実験はしない。

日付の絞り込みはgrep では苦手な分野なので重宝しそう。

また、grep ができないことや日付以外は jq を使えば条件書けるし工夫次第では便利だと思う。

参考資料

https://www.loggly.com/ultimate-guide/using-journalctl/