UP | HOME

使用Journalctl查询日志

Table of Contents

英文原文 How To Use Journalctl to View and Manipulate Systemd Logs | DigitalOcean

1 tldr

systemd 有自己的方式处理日志文件, 而不需要依赖任何外部日志系统

  • systemd 提供统一的日志处理功能, 工具命令 journalctl
  • journald 收集处理所有的内核, 进程产生的日志, 存储使用二进制存储, 可以方便的转换成不同的格式
  • 可以和 syslog 一起使用, 比如 syslog 作为日志中心服

2 基本 journalctl 命令

  • 查看所有日志 $ journalctl, 类似 less 命令, 老的日志在上面
  • 查看系统本次启动的日志 $ journalctl -b

查看所有的启动日志, 在一台ubuntu 16.04执行命令的结果

$ journalctl --list-boots
0 28eb5f70cb7c481bae3698d85005392e Sat 2018-04-07 22:02:19 UTC—Sun 2018-04-08 17:20:02 UTC

并不是所有的发行版都会保存过去启动的日志

配置 $ sudo nano /etc/systemd/journald.conf 来存储过去启动日志

[Journal]
Storage=persistent

日志存放路径 $ sudo mkdir -p /var/log/journal

多份启动日志

-2 caf0524a1d394ce0bdbcff75b94444fe Tue 2015-02-03 21:48:52 UTC—Tue 2015-02-03 22:17:00 UTC
-1 13883d180dc0420db0abcb5fa26d6198 Tue 2015-02-03 22:17:03 UTC—Tue 2015-02-03 22:19:08 UTC
 0 bed718b17a73415fade0e4e7f4bea609 Tue 2015-02-03 22:19:12 UTC—Tue 2015-02-03 23:01:01 UTC

查看日志 使用 journalctl -b -1 或者 journalctl -b caf0524a1d394ce0bdbcff75b94444fe

2.1 基于时间查询日志

使用 --since--until 选项

时间格式 YYYY-MM-DD HH:MM:SS

例如

$ journalctl --since "2015-01-10 17:15:00"

某段时间范围内

$ journalctl --since "2015-01-10" --until "2015-01-11 03:00"

也可以使用 "yesterday", "today", "tomorrow", "now" 等

查看昨天的日志 journalctl --since yesterday

如果收到上午9:00开始的服务中断报告,并且持续到一小时前,可以这样查询日志

$ journalctl --since 09:00 --until "1 hour ago"~

3 过滤日志

3.1 通过 Unit

使用 -u 参数

查看nginx的日志

$ journalctl -u nginx.service

加上时间过滤

$ journalctl -u nginx.service --since today

同时查看不同unit产生的日志非常方便

$ journalctl -u nginx.service -u php-fpm.service --since today

这样就可以按顺序时间查看nginx和php-fpm产生的日志

3.2 通过 pid user Group ID 过滤

查看 pid 8088 进程的日志 journalctl _PID=8088 查看 uid 33 今天的日志 journalctl _UID=33 --since today, 用户组是 _GID 参数

查看 所有可用字段 man systemd.journal-fields

一个更有用的选项 -F 会列表以下划线开头的字段的可用值

$ journalctl -F _UID
0
1002
$ journalctl -F _GID
1003
0

列出的值就是所有存储在日志中可用的值

3.3 查看内核日志

使用 -k 或者 –dmesg

$ journalctl -k

也可以查看指定某次boot的日志

$ journalctl -k -b -5

3.4 根据日志优先级(Priority)

使用 -p 选项 比如 journalctl -p err -b 会显示 error, critical, alert, emergency 优先级的日志

所有的优先级

0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug

4 日志显示

4.1 显示格式

使用 -o 指定输出日志格式

$journalctl -b -u nginx -o json

{ "__CURSOR" : "s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635", "__REALTIME_TIMESTAMP" : "1422990364739502", "__MONOTONIC_TIMESTAMP" : "27200938", "_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d", "PRIORITY" : "6", "_UID" : "0", "_GID" : "0", "_CAP_EFFECTIVE" : "3fffffffff", "_MACHINE_ID" : "752737531a9d1a9c1e3cb52a4ab967ee", "_HOSTNAME" : "desktop", "SYSLOG_FACILITY" : "3", "CODE_FILE" : "src/core/unit.c", "CODE_LINE" : "1402", "CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading", "SYSLOG_IDENTIFIER" : "systemd", "MESSAGE_ID" : "7d4958e842da4a758f6c1cdc7b36dcc5", "_TRANSPORT" : "journal", "_PID" : "1", "_COMM" : "systemd", "_EXE" : "/usr/lib/systemd/systemd", "_CMDLINE" : "/usr/lib/systemd/systemd", "_SYSTEMD_CGROUP" : "/", "UNIT" : "nginx.service", "MESSAGE" : "Starting A high performance web server and a reverse proxy server...", "_SOURCE_REALTIME_TIMESTAMP" : "1422990364737973" }

指定 json-pretty 更好的显示json

$ journalctl -b -u nginx -o json-pretty

{
    "__CURSOR" : "s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635",
    "__REALTIME_TIMESTAMP" : "1422990364739502",
    "__MONOTONIC_TIMESTAMP" : "27200938",
    "_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d",
    "PRIORITY" : "6",
    "_UID" : "0",
    "_GID" : "0",
    "_CAP_EFFECTIVE" : "3fffffffff",
    "_MACHINE_ID" : "752737531a9d1a9c1e3cb52a4ab967ee",
    "_HOSTNAME" : "desktop",
    "SYSLOG_FACILITY" : "3",
    "CODE_FILE" : "src/core/unit.c",
    "CODE_LINE" : "1402",
    "CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading",
    "SYSLOG_IDENTIFIER" : "systemd",
    "MESSAGE_ID" : "7d4958e842da4a758f6c1cdc7b36dcc5",
    "_TRANSPORT" : "journal",
    "_PID" : "1",
    "_COMM" : "systemd",
    "_EXE" : "/usr/lib/systemd/systemd",
    "_CMDLINE" : "/usr/lib/systemd/systemd",
    "_SYSTEMD_CGROUP" : "/",
    "UNIT" : "nginx.service",
    "MESSAGE" : "Starting A high performance web server and a reverse proxy server...",
    "_SOURCE_REALTIME_TIMESTAMP" : "1422990364737973"
}

其它格式

  • cat: 仅显示消息字段本身
  • export: 适合传输或备份的二进制格式
  • json: 标准JSON,每行一个条目
  • json-pretty:更好可读性的json
  • json-sse: server-sent event 兼容的json格式
  • short: 默认syslog的显示格式
  • short-iso: ISO 8601 时间戳
  • short-monotonic
  • short-precise: 微秒精度
  • verbose 显示所有日志可用字段

5 动态显示日志

5.1 显示最近的日志

使用 -n 选项, journalctl -n 默认显示最近10条日志, 显示20条需要指定条数 journalctl -n 20

实时滚动显示最新日志, 使用 -f 选项 journalctl -f

6 其它

查看日志存储空间

$ journalctl --disk-usage

Journals take up 8.0M on disk.

删除老日志

sudo journalctl --vacuum-size=1G –vacuum-size 选项删除日志直到指定的容量

使用 –vacuum-time 根据时间删除日志, 删除去年的日志 sudo journalctl --vacuum-time=1years

/etc/systemd/journald.conf 一些配置项可以限制Journal 空间占用

  • SystemMaxUse 指定日记在持久存储中可以使用的最大磁盘空间
  • SystemKeepFree
  • SystemMaxFileSize 单个日志大小
  • RuntimeMaxUse 最大占用 /run 大小
  • RuntimeKeepFree
  • RuntimeMaxFileSize 运行时单个日志最大, /run

7 links

Author: lidashuang

Created: 2018-05-04 Fri 13:08

Emacs 25.3.3 (Org mode 8.2.10)