目录

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. [20170705]理解linux su命令.txt

    [20170705]理解linux su命令.txt --//我一般在维护时经常使用root用户登录,然后su - oracle 转到其他用户操作--//一般都加入 - 参数.这个已经成了条件反射.. ...

  2. Python和Lua的默认作用域以及闭包

    默认作用域 前段时间学了下Lua,发现Lua的默认作用域和Python是相反的.Lua定义变量时默认变量的作用域是全局(global,这样说不是很准确,Lua在执行x = 1这样的语句时会从当前环境开 ...

  3. Scrapy爬取遇到的一点点问题

    学了大概一个月Scrapy,自己写了些东东,遇到很多问题,这几天心情也不大好,小媳妇人也不舒服,休假了,自己研究了很久,有些眉目了 利用scrapy 框架爬取慕课网的一些信息 步骤一:新建项目 scr ...

  4. Python基础知识:字符串

    1.Python中大写字母命名的变量,默认为常量,不可修改:列如:MYSQL_CONNECTION = '192.168.1.1' 2.字符串换行输入格式:换行用\隔开,两行分别用引号,制表符\t,换 ...

  5. 【PAT】B1050 螺旋矩阵(25 分)

    实在不觉得递归等方式有什么简单的地方,没错我就是用的最笨的方法模拟. 和我一样的小白看代码应该很容易理解. #include<stdio.h> #include<math.h> ...

  6. January 09th, 2018 Week 02nd Tuesday

    Use the smile to change the world. Don't let the world change your smile. 用你的笑容去改变这个世界,别让这个世界改变了你的笑容 ...

  7. DFS普及组常用模板简单整理

    一些普及组会用到的DFS模板,其他的DFS我感觉普及组不会用到所以暂且搁着,等之后有时间了再细写w (至于我为什么最近不写TG相关只写最基础的PJ的内容,请戳这里了解) dfs各种模板big集合 1. ...

  8. 轻量级服务器部署方案 -(阿里云CenOS+宝塔)

    一台服务器部署多个应用.可部署前端工程.node服务.数据库等. 一.服务器选择合适的服务器,购买即可.服务器商1.阿里云 2.腾讯云 3.百度云 二.服务器管理面板-宝塔宝塔面板是一款服务器管理软件 ...

  9. UVA10129-Play on Words(欧拉路径)

    Problem UVA10129-Play on Words Accept: 2534  Submit: 19477 Time Limit: 3000 mSec Problem Description ...

  10. [HAOI2017]供给侧改革

    题目 这道题我们其实就是利用了一棵后缀树 由于字符串是随机的,所以这个后缀树的树高是\(log\)的,基于树高的算法是能过的 我们考虑后缀树上的两个节点的\(lca\)就是这两个节点所代表的后缀的\( ...