0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

linux日志管理之journalctl命令

马哥Linux运维 来源:博客园sparkdev 2024-08-14 18:18 次阅读

目录

  • Help
  • 输出所有的日志记录
  • 匹配(match)
  • 把日志保存到文件中
  • 限定日志所能占用的最高容量
  • 查看某次启动后的日志
  • 查看指定时间段的日志
  • 同时应用 match 和时间过滤条件
  • 按 unit 过滤日志
  • 通过日志级别进行过滤
  • 实时更新日志
  • 只显示最新的 n 行
  • 控制输出
  • 按可执行文件的路径过滤
  • 查看内核日志
  • 总结

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

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

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

Help

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

$ man journalctl
$ journalctl -h

输出所有的日志记录

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

$ sudo journalctl

wKgaoma8hKeAQMsTAABtScTXN6w548.png

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

匹配(match)

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

_SYSTEMD_UNIT=cron.service

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

wKgZoma8hKeAUKVqAACk9SQa7hk331.png

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

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

$ journalctl _SYSTEMD_UNIT=cron.service PRIORITY=6

wKgaoma8hKeAUye6AATEfgoP6-g076.png

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

$ journal -F PRIORITY

wKgZoma8hKeAXzMZAAG_SjRz2CA835.png

具体的对应方式如下:
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 目录下:

wKgaoma8hKeAD5pvAAK5TdSJ9NY381.png

查看日志占据的磁盘空间

$ sudo journalctl --disk-usage

wKgZoma8hKeANKeJAAD9s35wmN4790.png

注意:无论是否设置把日志存储到文件,都会得到 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

wKgZoma8hKeAWgu7AAF9YNzi3bA653.png

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

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

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

$ sudo journalctl -b
$ sudo journalctl -b  0

查看指定时间段的日志

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

YYYY-MM-DD HHSS

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

$ journalctl --since "2018-03-26 2000"

如果以上格式中的某些组成部分未进行填写,系统会直接进行默认填充。例如,如果日期部分未填写,则会直接显示当前日期。如果时间部分未填写,则缺省使用 "0000"(午夜)。秒字段亦可留空,默认值为 "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"

wKgaoma8hKeASZ27AAIW6x-p-uo712.png

按 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

wKgZoma8hRSAPglZAAQQjdPPWD0453.png

而 json-pretty 的格式为:

wKgaoma8hSCAACZrAAeAnJFInQo172.png

按可执行文件的路径过滤

如果在参数中指定某个可执行文件(二进制文件或脚本文件),则 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 工具。它的好处是使用一个统一的工具来完成日志的查看功能,我们不用记很多的命令了。

链接:https://www.cnblogs.com/sparkdev/p/8795141.html

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11120

    浏览量

    207820
  • 命令
    +关注

    关注

    5

    文章

    657

    浏览量

    21922
  • 日志
    +关注

    关注

    0

    文章

    128

    浏览量

    10591

原文标题:高效linux 日志管理:journalctl命令

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    企业级的LInux系统日志管理

    企业级LInux系统日志管理
    发表于 05-29 11:33

    Linux系统日志管理

    Linux-系统日志
    发表于 06-04 17:24

    linux日志常用命令有哪些

    linux日志常用命令
    发表于 06-04 09:00

    Linux系统管理命令

    Linux系统管理命令 Linux系统管理命令  wall
    发表于 01-18 12:47 788次阅读

    Linux系统管理命令整理及使用方法介绍

    linux命令是对Linux系统进行管理命令。对于Linux系统来说,无论是中央处理器、内存、
    的头像 发表于 09-23 14:55 6734次阅读

    Linux教程之常用Linux命令的详细资料免费下载

    Linux的系统管理主要在控制终端下进行,通过使用命令行的方式进行管理Linux的文件命令可以
    发表于 11-16 16:17 14次下载

    Linux中mail命令的使用教程分享

    在这里整理一下Linux中mail命令的使用。mail也是一个常用的命令,我们在很多地方都要用到它,比如定时把系统状况或日志发送到我们的邮箱里等等。
    发表于 03-25 16:01 9次下载

    Linux虚拟机tcpdump命令操作详解

    Linux虚拟机tcpdump命令操作详解
    发表于 08-12 09:50 23次下载

    Linux操作必备150个命令

    Linux 命令是对 Linux 系统进行管理命令。对于 Linux 系统来说,无论是中央处理
    发表于 11-12 09:19 404次阅读

    如何使用journalctl来读取、监控和分析Linux中的日志

    Systemd是大多数主要Linux发行版的默认的初始化程序。Systemd的主要功能之一收集日志以及为分析日志提供工具。
    的头像 发表于 12-23 16:44 4082次阅读

    常用Linux命令介绍

    linux命令是对Linux系统进行管理命令。对于Linux系统来说,无论是中央处理器、内存、
    的头像 发表于 02-09 14:31 973次阅读

    如何使用ip命令Linux中进行网络管理

    Linux中,'ip'命令管理网络方面最强大的命令之一。该命令可以允许用户在不使用任何其他网络
    发表于 05-31 12:25 300次阅读

    常用Linux命令要记牢!

    linux命令是对Linux系统进行管理命令。对于Linux系统来说,无论是中央处理器、内存、
    的头像 发表于 08-07 15:31 559次阅读

    shell命令linux命令一样吗

    结合在一起,形成一个相当于面向过程的程序,即shell script,从而实现一些复杂的功能。 而Linux命令则是用来对Linux系统进行管理
    的头像 发表于 11-08 10:51 2391次阅读

    logcat命令抓取日志方法

    命令抓取日志 logcat -b main -b system -b crash -r 1024 -n 5 -f android.log -v threadtime -b:加载可供查看的缓冲区的日志
    的头像 发表于 11-23 17:31 876次阅读
    logcat<b class='flag-5'>命令</b>抓取<b class='flag-5'>日志</b>方法