journalctl 用来查询 systemd-journald 服务收集到的日志。systemd-journald 服务是 systemd init 系统提供的收集系统日志的服务。

命令格式为:
journalctl [OPTIONS…] [MATCHES…]

journalctl 命令的路径为:
/bin/journalctl

Help

可以通过 man page 和 -h 选项来获得最直接的帮助文档:

$ man journalctl
$ journalctl -h

输出所有的日志记录

不带任何选项时,journalctl 输出所有的日志记录:

$ sudo journalctl

这基本上没什么用处,因为你立即就被洪水般的日志记录给淹没了。所以,接下来我们学习如何高效的过滤出有价值的日志信息。

匹配(match)

我们可以通过 "FIELD=VALUE" 的格式来匹配具体的日志记录, 如:

_SYSTEMD_UNIT=cron.service

日志信息的定义也类似一个实体类型,具体的信息被保存在各个对应的字段中,比如 MESSAGE、MESSAGE_ID、_PID、_UID、_HOSTNAME、_SYSTEMD_UNIT 等等(通过 man 7 systemd.journal-fields 可以查看所有可用的 match 字段)。因此可以通过这些字段的内容匹配相关的日志记录:

上图中的输出是 cron.service 服务相关的日志记录。

可以同时添加多个字段进行匹配,它们之间是与的关系,就是同时符合多个条件的记录才会被匹配,比如添加 PRIORITY 字段的匹配条件:

$ journalctl _SYSTEMD_UNIT=cron.service PRIORITY=6

注意各个字段的取值,比如为 PRIORITY 设置 debug、info 是不工作的,必须设置为对应的数字。可以通过 -F 选项来查看某个字段的可选值:

$ journal -F PRIORITY 

具体的对应方式如下:
0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug

对同一个字段应用多个 match 条件的情况,比如:

$ journalctl _SYSTEMD_UNIT=cron.service _SYSTEMD_UNIT=prometheus.service

此时 cron.service 和 prometheus.service 的日志都会输出。

多个 match 条件的或操作
使用 "+" 号可以对多个匹配字段执行或操作:

$ journalctl _SYSTEMD_UNIT=cron.service + _PID=28097

上面的命令会输出 cron.service 的日志和进程 28097 的日志。

下面是一个更复杂的例子:

$ journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=28097 + _SYSTEMD_UNIT=dbus.service

前面的两个条件是与的关系,最后一个条件与前面的两个条件是或的关系,也就是相对于用小括号把前面的两个条件括起来。

把日志保存到文件中

systemd-journald 服务收集到的日志默认保存在 /run/log 目录中,重启系统会丢掉以前的日志信息。 我们可以通过两种方式让 systemd-journald 服务把所有的日志都保存到文件中,这样重新启动后就不会丢掉以前的日志。
方法一:创建目录 /var/log/journal,然后重启日志服务 systemd-journald.service。
方法二:修改配置文件 /etc/systemd/journald.conf,把 Storage=auto 改为 Storage=persistent,并取消注释,然后重启日志服务 systemd-journald.service。

方法一的详细操作
在 /var/log/ 下面创建名为 journal 的目录,并设置权限即可:

$ sudo mkdir /var/log/journal
$ sudo chown root:systemd-journal /var/log/journal
$ sudo chmod 2775 /var/log/journal
$ sudo systemctl restart systemd-journald.service

之后 /run/log 下面就没有 journal 的日志了,日志文件被保存在 /var/log/journal 目录下:

查看日志占据的磁盘空间

$ sudo journalctl --disk-usage

注意:无论是否设置把日志存储到文件,都会得到 disk-usage。

清理日志数据
如果大家打算对 journal 记录进行清理,则可使用两种不同方式。

  • 使用 –vacuum-size 选项
  • 使用 –vacuum-time 选项

如果使用 –vacuum-size 选项,则可硬性指定日志的总体体积,意味着其会不断删除旧有记录直到所占容量符合要求:

$ sudo journalctl --vacuum-size=1G

另一种方式则是使用 –vacuum-time 选项。任何早于这一时间点的条目都将被删除。例如,去年之后的条目才能保留:

$ sudo journalctl --vacuum-time=1years

限定日志所能占用的最高容量

我们可以通过 /etc/systemd/journald.conf 文件来配置 systemd-journald 服务的行为。以下条目可用于限定日志数据可以占用的最大存储数量和日志数据体积的膨胀速度:
SystemMaxUse=:指定journal所能使用的最高持久存储容量。
SystemKeepFree=:指定journal在添加新条目时需要保留的剩余空间。
SystemMaxFileSize=:控制单一journal文件大小,符合要求方可被转为持久存储。
RuntimeMaxUse=:指定易失性存储中的最大可用磁盘容量(/run文件系统之内)。
RuntimeKeepFree=:指定向易失性存储内写入数据时为其它应用保留的空间量(/run文件系统之内)。
RuntimeMaxFileSize=:指定单一journal文件可占用的最大易失性存储容量(/run文件系统之内)。
通过设置上述值,大家可以控制 systemd-journald 服务对服务器空间的消耗及保留方式。

查看某次启动后的日志

默认情况下 systemd-journald 服务只保存本次启动后的日志(重新启动后丢掉以前的日志)。此时 -b 选项是没啥用的。当我们把 systemd-journald 服务收集到的日志保存到文件中之后,就可以通过下面的命令查看系统的重启记录:

$ journalctl --list-boots 

此时我们就可以通过 -b 选项来选择查看某次运行过程中的日志:

$ sudo journalctl -b -1
或
$ sudo journalctl -b 9eaabbc25fe343999ef1024e6a16fb58

下面的命令都会输出最后一次启动后的日志信息:

$ sudo journalctl -b
$ sudo journalctl -b  0

查看指定时间段的日志

利用 --since 与 --until 选项设定时间段,二者分别负责指定给定时间之前与之后的日志记录。时间值可以使用多种格式,比如下面的格式:

YYYY-MM-DD HH:MM:SS

如果我们要查询 2018 年 3 月 26 日下午 8:20 之后的日志:

$ journalctl --since "2018-03-26 20:20:00"

如果以上格式中的某些组成部分未进行填写,系统会直接进行默认填充。例如,如果日期部分未填写,则会直接显示当前日期。如果时间部分未填写,则缺省使用 "00:00:00"(午夜)。秒字段亦可留空,默认值为 "00",比如下面的命令:

$ journalctl --since "2018-03-26" --until "2018-03-26 03:00"

另外,journalctl 还能够理解部分相对值及命名简写。例如,大家可以使用 "yesterday"、"today"、"tomorrow" 或者 "now" 等。
比如获取昨天的日志数据可以使用下面的命令:

$ journalctl --since yesterday

要获得早上 9:00 到一小时前这段时间内的日志,可以使用下面的命令:

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

同时应用 match 和时间过滤条件

实际的使用中更常见的用例是同时应用 match 和时间条件,比如要过滤出某个时间段中 cron 服务的日志记录:

$ sudo journalctl _SYSTEMD_UNIT=cron.service --since "2018-03-27" --until "2018-03-27 01:00"

按 unit 过滤日志

systemd 把几乎所有的任务都抽象成了 unit,因此我们可以方便的使用 -u 选项通过 unit 的名称来过滤器日志记录。查看某个 unit 的日志:

$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today

还可以使用多个 -u 选项同时获得多个 unit 的日志:

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

通过日志级别进行过滤

除了通过 PRIORITY= 的方式,还可以通过 -p 选项来过滤日志的级别。 可以指定的优先级如下:
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug

$ sudo journalctl -p err

注意,这里指定的是优先级的名称。

实时更新日志

与 tail -f 类似,journalctl 支持 -f 选项来显示实时的日志:

$ sudo journalctl -f

如果要查看某个 unit 的实时日志,再加上 -u 选项就可以了:

$ sudo journalctl -f -u prometheus.service

只显示最新的 n 行

命令行选项 -n 用来控制只显示最新的 n 行日志,默认是显示尾部的最新 10 行日志:

$ sudo journalctl -n

也可以显示尾部指定行数的日志:

$ sudo journalctl -n 20

下面则是显示 cron.service 服务最新的三行日志:

$ journalctl -u cron.service -n 3

控制输出

把结果重定向到标准输出
默认情况下,journalctl 会在 pager 内显示输出结果。如果大家希望利用文本操作工具对数据进行处理,则需要使用标准输出。在这种情况下,我们需要使用 --no-pager 选项。

$ sudo journalctl --no-pager

这样就可以把结果重定向到我们需要的地方(一般是磁盘文件或者是文本工具)。

格式化输出的结果
如果大家需要对日志记录进行处理,可能需要使用更易使用的格式以简化数据解析工作。幸运的是,journalctl 能够以多种格式进行显示,只须添加 -o 选项即可。-o 选项支持的类型如下:
    short
       这是默认的格式,即经典的 syslog 输出格式。
    short-iso
       与 short 类似,强调 ISO 8601 时间戳。
    short-precise
       与 short 类似,提供微秒级精度。
    short-monotonic
       与 short 类似,强调普通时间戳。
    verbose
       显示全部字段,包括通常被内部隐藏的字段。
    export
       适合传输或备份的二进制格式。
    json
       标准 json 格式,每行一条记录。
    json-pretty
       适合阅读的 json 格式。
    json-sse
       经过包装可以兼容 server-sent 事件的 json 格式。
    cat
       只显示信息字段本身。

比如我们要以 json 格式输出 cron.service 的最后一条日志:

$ sudo journalctl -u cron.service -n 1 --no-pager -o json

而 json-pretty 的格式为:

按可执行文件的路径过滤

如果在参数中指定某个可执行文件(二进制文件或脚本文件),则 journalctl 会显示与该可执行文件相关的全部条目。比如可以显示 /usr/lib/systemd/systemd 程序产生的日志:

$ sudo journalctl /usr/lib/systemd/systemd

也可以显示 /usr/bin/bash 程序产生的日志:

$ sudo journalctl /usr/bin/bash

查看内核日志

如果我们需要查看内核日志,可以指定 -k 选项,这样输出的结果中就只有内核日志了。-k 选项是通过 -b 选项加上匹配条件 "_TRANSPORT=kernel" 实现的。下面是基本的用法:

$ sudo journalctl -k

总结

进入 systemd 时代后,查看日志的方式也发生了变化,原因是 systemd 自带了日志管理服务和工具。单就日志的查看来说,我们需要使用 journalctl 工具。它的好处是使用一个统一的工具来完成日志的查看功能,我们不用记很多的命令了。

linux journalctl 命令 查询systemd init 系统日志相关推荐

  1. Linux journalctl 命令

    Linux journalctl 命令 1. journalctl 作用 2. journalctl 的配置文件 3. journalctl 用法 3. journalctl -xe 常用参数 参考 ...

  2. linux常用命令-查询手册

    目录 linux常用命令 〇.连接远程linux主机 一.日常使用命令 1.开关机命令 2.常用快捷键命令 3.常用工具命令 二.常用目录或文件操作命令 1.展示目录列表命令ls(list) 2.切换 ...

  3. linux登录主机命令,linux w命令查询已登录主机的用户信息

    Linux w命令用于显示目前登入系统的用户信息. 语法 w [-fhlsuV][用户名称] 参数说明:-f 开启或关闭显示用户从何处登入系统. -h 不显示各栏位的标题信息列. -l 使用详细格式列 ...

  4. 百战RHCE(第十二战:Linux进阶命令九-systemd daemon 极简管理)

    哈喽哈喽哈喽,大家好啊,很高兴大家能看到这篇文章! 首先,本人目前是计算机专业的大一学生,基于对Linux操作系统的爱好,参与了RHCE的培训班,而我这次编写的 <百战RHCE>文章,是基 ...

  5. linux man 命令查询系统函数

     man的分卷号,分成很多部分,分别是: 1 用户命令, 可由任何人启动的. 2 系统调用, 即由内核提供的函数. 3 例程, 即库函数,比如标准C库libc. 4 设备, 即/dev目录下的特殊 ...

  6. linux rpm命令 查询包安装与否、包详细信息、包安装位置、文件属于哪个包、包依赖

    查询这个包是否已安装 rpm -q 包名 rpm -qa -q 查询 -a all 查询已安装软件包和未安装软件包详细信息 rpm -qi 包名 rpm -qip 包全名 -i 查询软件信息 -p p ...

  7. Linux TOP命令查询结果分析

    top命令通常都是用来查看当前系统情况的命令:具体参数可以 top - 去查看 第一行主要是介绍当前系统运行了54天 当前5个登录用户 load average表示系统平均负载(在特定时间间隔内运行队 ...

  8. Linux: Top命令查询结果参数详解

    1.top  -H -p 16482  (某个进程内部线程的运行情况) 整体统计信息 第一行:系统运行状态和平均负载 ​第一个参数:目前的时间 :10:14分 ​第二个参数:系统目前运行的时间:运行了 ...

  9. Linux基础知识之systemd详解

    0x00 Systemd 简述 1.Linux 启动流程 2.主角登场 0x01 Systemd Unit 1.配置文件 2.启动流程 3.进程树(Process tree) 4.运行级别 0x02 ...

最新文章

  1. SAP PP 成品工单批次号跟所消耗的半成品批次号一致
  2. 自底向上构建知识图谱全过程
  3. Java关键字synchronized详解
  4. 第一阶段SCRUM冲刺 08
  5. Java基础语法(一)
  6. 遵循Java EE标准规范的开源GIS服务平台之三:数据发布与访问
  7. php 同义词词库,php如何实现同义词替换
  8. 系统分析师考试大纲(2009版)
  9. 产品结构图 = 产品功能结构图 + 产品信息结构图
  10. 幼儿-综合素质【8】
  11. 让zotero支持markdown笔记
  12. 六【Java 基础】数组的概述: 数组的定义与使用
  13. Python自动切换wifi
  14. excel调用python编程-超简单:用Python让Excel飞起
  15. AVUE 点击编辑按钮拉起弹窗前增加自己的操作
  16. Microsoft .NET Framework 4(独立安装程序)
  17. 使用轻量级虚拟桌面基础架构 (VDI) 解决方案降低 IT 成本并保护数字知识产权
  18. 软件测试模型 — 测试金字塔
  19. 关于Adams驱动函数单位与符号d的问题
  20. 1.Arduino入门项目1-超声波测距仪(附项目源码、库文件、电路图、材料清单等资料)

热门文章

  1. Tungsten Fabric SDN — SmartNIC vRouter 软件架构设计
  2. 反激式开关电源变压器设计
  3. FlashFTP工具的自动缓存服务器目录的功能
  4. Redis与DB数据同步问题
  5. 进程同步控制 Lock Semaphore Event
  6. SAP R3 在windows XP下 安装成功心得分享
  7. POWERSHELL基于ConvertTo-Htm指定单元格效果css风格html报表
  8. UML 2.0(装载)
  9. VC 文件操作大全,打开,保存,复制,删除,查找等
  10. PAT A1017 优先队列