目录

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=

注意各个字段的取值,比如为 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=

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

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

$ journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID= + _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 /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 -

$ sudo journalctl -b 9eaabbc25fe343999ef1024e6a16fb58

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

$ sudo journalctl -b
$ sudo journalctl -b

查看指定时间段的日志

利用 --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 : --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 

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

$ journalctl -u cron.service -n 

控制输出

把结果重定向到标准输出
默认情况下,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  --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 命令的更多相关文章

  1. Linux journalctl命令

    在Systemd出现之前,Linux系统及各应用的日志都是分别管理的,Systemd开始统一管理了所有Unit的启动日志,这样带来的好处就是可以只用一个 journalctl命令,查看所有内核和应用的 ...

  2. linux grep命令

    linux grep命令1.作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expressio ...

  3. Linux常用命令(一)

    Linux常用命令 1. pwd查看当前路径(Print Working Directory)    [root@CentOS ~]# pwd/root 2. cd .. 返回上一级 .. 表示上一级 ...

  4. Linux下命令行安装weblogic10.3.6

    Linux下命令行安装weblogic10.3.6 一.安装前准备工作: 1.创建用户useradd weblogic;创建用户成功linux系统会自动创建一个和用户名相同的分组,并将该用户分到改组中 ...

  5. Linux paste命令

    Linux paste命令用于合并文件的列. paste指令会把每个文件以列对列的方式,一列列地加以合并. 语法 paste [-s][-d <间隔字符>][--help][--versi ...

  6. 20145222《信息安全系统设计基础》Linux常用命令汇总

    学习Linux时常用命令汇总 通过Ctrl+f键可在该网页搜索到你想要的命令. Linux中命令格式为:command [options] [arguments] //中括号代表是可选的,即有些命令不 ...

  7. Linux sudo 命令的应用

    .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...

  8. linux 基础命令与文件管理

      Linux终端介绍 Shell提示符 Bash Shell基本语法 基本命令的使用:ls.pwd.cd 查看系统和BIOS硬件时间 Linux如何获得帮助 Linux关机命令:shutdow.in ...

  9. linux awk命令详解

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

随机推荐

  1. URL编码:怎样读取特殊字符

    URL编码:怎样读取特殊字符 (这个我曾经谢过教程,这里整理过来)从外部文本载入到动态文本的时候,一些特殊字符(如&/%等)无法正常现实,有的符号还会导致这个符号后面的字符无法现实(如& ...

  2. python第十七天---时间模块、random模块

    作完一个作业,开始新的学习: 有由今天的时间有限所有学习了以下两个模块,明天继续! 时间模块.random模块 import time #!usr/bin/env python #-*-coding: ...

  3. 【PAT】B1071 小赌怡情(15 分)

    水题一道,直接贴代码 #include<cstdio> #include<string.h> int main(){ //玩家的筹码数.以及 int T,K;scanf(&qu ...

  4. zookeeper-03 命令行操作

    1. 前言 在3台机器分别部署了zookeeper-3.4.5,本文操作是在此基础上进行的.部署详情参见上一篇文章 2. 客户端登录与帮助查看 # 由于是集群模式,所以可以在3台机器的其中任意一台进行 ...

  5. February 6th, 2018 Week 6th Tuesday

    To be is to be perceived. 存在即被感知. How to interpret this quote? Maybe it means that everything in you ...

  6. pek (北大oj)3070

    思路:矩阵快速幂, 二分加速 #include<cstdio> #include<cstring> #define ll long long #define mod 10000 ...

  7. dd测试

    time dd if=/dev/zero of=/root/test.db2 bs=200K count=10000 oflag=dsync

  8. 【js】 ==与===区别

    1.对于string,number等基础类型,==和===是有区别的 1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等 2)同类型比较,直接进 ...

  9. Arduino IDE for ESP8266 项目(4)HTTP客户端+服务端

    Arduio for esp8266  官网API:http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html 很有 ...

  10. go标准库的学习-crypto/rand

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/rand" rand包实现了用于加解密的更安全的随机数生成器. Var ...