侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux journalctl命令教程:如何高效利用系统日志分析工具journalctl

Linux journalctl命令介绍

journalctl命令是journal control的缩写,它是一个用来查看和管理systemd日志的命令。systemd是一个Linux系统的初始化系统和服务管理器,它负责启动和管理各种系统服务和进程。systemd使用二进制格式来存储日志,而不是传统的文本格式,这样可以提高日志的性能和安全性。journalctl命令可以让我们以各种方式来过滤和显示日志,比如按照时间、优先级、单元、进程等。journalctl命令还可以用来旋转、清理和验证日志文件。

Linux journalctl命令适用的Linux版本

journalctl命令是systemd的一部分,所以它只适用于使用systemd的Linux发行版,比如Ubuntu、Debian、Fedora、CentOS等。如果你的Linux发行版没有使用systemd,那么你可能需要使用其他的命令来查看日志,比如tail、grep、less等。你可以使用以下命令来检查你的Linux发行版是否使用了systemd:

[linux@bashcommandnotfound.cn ~]$ ps -p 1 -o comm=
systemd

如果输出是systemd,那么你就可以使用journalctl命令。如果输出是其他的,那么你就需要使用其他的命令。

Linux journalctl命令的基本语法

journalctl命令的基本语法如下:

journalctl [options] [match...]

其中,options是一些可选的参数,用来控制日志的显示和管理。match是一些匹配条件,用来过滤日志。如果没有指定任何options或match,那么journalctl命令会显示所有的日志,按照时间顺序从旧到新。

Linux journalctl命令的常用选项或参数说明

journalctl命令有很多的选项或参数,我们这里只介绍20个最常用的,如果你想了解更多的选项或参数,你可以使用man journalctl命令来查看帮助文档。以下是20个最常用的选项或参数的说明:

选项或参数说明
-a, --all显示所有的日志,包括无效的或不可打印的字符
-b, --boot[=ID]显示指定的启动日志,如果没有指定ID,那么显示当前的启动日志
-e, --pager-end跳转到日志的最后一页
-f, --follow实时显示日志,类似于tail -f命令
-h, --help显示帮助信息
-n, --lines[=INTEGER]显示指定的行数的日志,如果没有指定INTEGER,那么显示10行
-o, --output=FORMAT指定日志的输出格式,FORMAT可以是short, short-iso, short-precise, short-monotonic, verbose, export, json, json-pretty, json-sse, cat
-p, --priority=RANGE显示指定的优先级范围的日志,RANGE可以是数字或者名称,数字越小,优先级越高,名称可以是emerg, alert, crit, err, warning, notice, info, debug
-r, --reverse按照时间顺序从新到旧显示日志
-u, --unit=UNIT显示指定的单元的日志,UNIT可以是服务名,比如sshd.service
--since=DATE显示指定日期之后的日志,DATE可以是各种格式,比如"2015-01-10", "yesterday", "1 hour ago"等
--until=DATE显示指定日期之前的日志,DATE的格式同上
--disk-usage显示日志占用的磁盘空间
--vacuum-size=SIZE清理日志,直到日志的大小小于指定的SIZE,SIZE可以是各种单位,比如"G", "M", "K"等
--vacuum-time=TIME清理日志,直到日志的时间小于指定的TIME,TIME可以是各种单位,比如"years", "months", "weeks", "days"等
--verify验证日志文件的完整性和一致性
--list-boots列出所有的启动日志的ID和时间
--no-pager不使用分页器来显示日志,而是直接输出到标准输出
--no-tail不显示日志的最后几行,而是显示所有的日志
--new-id128生成一个新的128位的ID,用于日志的识别

Linux journalctl命令的实例

下面我们来看一些journalctl命令的实例,你可以根据自己的需要来尝试这些命令,也可以自己组合一些选项或参数来实现更多的功能。

实例1:显示所有的日志

如果没有指定任何选项或参数,那么journalctl命令会显示所有的日志,按照时间顺序从旧到新。你可以使用方向键或者PgUp和PgDn来翻页,使用/来搜索,使用q来退出。你可以看到每条日志都包含了时间、主机名、进程名、进程ID和日志内容等信息。

[linux@bashcommandnotfound.cn ~]$ journalctl
-- Logs begin at Tue 2023-12-26 16:36:15 HKT, end at Tue 2023-12-26 16:36:15 HKT. --
Dec 26 16:36:15 linux systemd-journald[267]: Journal started
Dec 26 16:36:15 linux kernel: Initializing cgroup subsys cpuset
Dec 26 16:36:15 linux kernel: Initializing cgroup subsys cpu
Dec 26 16:36:15 linux kernel: Initializing cgroup subsys cpuacct
Dec 26 16:36:15 linux kernel: Linux version 3.10.0-957.el7.x86_64 (mockbuild@x86-
...

实例2:显示当前的启动日志

如果你只想查看当前的启动日志,你可以使用-b或者--boot选项,不需要指定任何ID。这样可以过滤掉之前的启动日志,只显示当前的启动日志。

[linux@bashcommandnotfound.cn ~]$ journalctl -b
-- Logs begin at Tue 2023-12-26 16:36:15 HKT, end at Tue 2023-12-26 16:36:15 HKT. --
Dec 26 16:36:15 linux systemd-journald[267]: Journal started
Dec 26 16:36:15 linux kernel: Initializing cgroup subsys cpuset
Dec 26 16:36:15 linux kernel: Initializing cgroup subsys cpu
Dec 26 16:36:15 linux kernel: Initializing cgroup subsys cpuacct
...

实例3:显示指定的启动日志

如果你想查看之前的启动日志,你可以使用-b或者--boot选项,并指定一个ID。你可以使用--list-boots选项来查看所有的启动日志的ID和时间。比如,如果你想查看倒数第二次的启动日志,你可以使用-b -1选项。

[linux@bashcommandnotfound.cn ~]$ journalctl --list-boots
-2 4c3f2a9fbbd04a9e8e894f8f9f8f9f8f Tue 2023-12-26 15:36:15 HKT—Tue 2023-12-26 16:36:15 HKT
-1 5d4e3b0accd14b8f9e894f8f9f8f9f8f Tue 2023-12-26 16:36:15 HKT—Tue 2023-12-26 16:36:15 HKT
 0 6e5f4c1bddf24c9e8e894f8f9f8f9f8f Tue 2023-12-26 16:36:15 HKT—Tue 2023-12-26 16:36:15 HKT
[linux@bashcommandnotfound.cn ~]$ journalctl -b -1
-- Logs begin at Tue 2023-12-26 15:36:15 HKT, end at Tue 2023-12-26 16:36:15 HKT. --
Dec 26 15:36:15 linux systemd-journald[267]: Journal started
Dec 26 15:36:15 linux kernel: Initializing cgroup subsys cpuset
...

实例4:实时显示日志

如果你想实时显示日志,你可以使用-f或者--follow选项,这样可以持续显示最新的日志,类似于tail -f命令。你可以使用Ctrl+C来终止实时显示。

[linux@bashcommandnotfound.cn ~]$ journalctl -f
-- Logs begin at Tue 2023-12-26 15:36:15 HKT. --
Dec 26 16:36:15 linux systemd[1]: Started Session 1 of user root.
Dec 26 16:36:15 linux systemd[1]: Starting Session 1 of user root.
Dec 26 16:36:15 linux login[1000]: ROOT LOGIN ON tty1
Dec 26 16:36:15 linux systemd-logind[300]: New session 1 of user root.
Dec 26 16:36:15 linux systemd[1]: Started Getty on tty1.
Dec 26 16:36:15 linux systemd[1]: Starting Getty on tty1.
Dec 26 16:36:15 linux kernel: random: nonblocking pool is initialized
Dec 26 16:36:15 linux systemd[1]: Reached target Login Prompts.
...

实例5:显示指定的行数的日志

如果你想显示指定的行数的日志,你可以使用-n或者--lines选项,并指定一个整数。这样可以只显示最新的指定行数的日志,而不是显示所有的日志。比如,如果你想显示最新的20行的日志,你可以使用-n 20选项。

[linux@bashcommandnotfound.cn ~]$ journalctl -n 20
Dec 26 16:36:15 linux systemd[1]: Started Update UTMP about System Runlevel Changes.
Dec 26 16:36:15 linux systemd[1]: Starting Update UTMP about System Runlevel Changes.
Dec 26 16:36:15 linux systemd[1]: Startup finished in 1.234s (kernel) + 2.345s (initrd) + 3.456s (userspace) = 7.045s.
...

实例6:显示指定的输出格式的日志

如果你想显示指定的输出格式的日志,你可以使用-o或者--output选项,并指定一个格式。这样可以改变日志的显示样式,比如简洁的、详细的、导出的、JSON的等。比如,如果你想显示JSON格式的日志,你可以使用-o json选项。

[linux@bashcommandnotfound.cn ~]$ journalctl -o json
{"__CURSOR":"s=4c3f2a9fbbd04a9e8e894f8f9f8f9f8f;i=1;b=4c3f2a9fbbd04a9e8e894f8f9f8f9f8f;m=0;t=0;x=0","__REALTIME_TIMESTAMP":"1639938975789000","__MONOTONIC_TIMESTAMP":"0","_BOOT_ID":"4c3f2a9fbbd04a9e8e894f8f9f8f9f8f","PRIORITY":"6","_TRANSPORT":"journal","_UID":"0","_GID":"0","_CAP_EFFECTIVE":"3fffffffff","_SELINUX_CONTEXT":"system_u:system_r:kernel_t:s0","_MACHINE_ID":"4c3f2a9fbbd04a9e8e894f8f9f8f9f8f","_HOSTNAME":"linux","SYSLOG_FACILITY":"3","SYSLOG_IDENTIFIER":"systemd-journald","MESSAGE_ID":"f77379a8490b408bbe5f6940505a777b","MESSAGE":"Journal started","_PID":"267","_COMM":"systemd-journal","_EXE":"/usr/lib/systemd/systemd-journald","_CMDLINE":"/usr/lib/systemd/systemd-journald","_SYSTEMD_CGROUP":"/system.slice/systemd-journald.service","_SYSTEMD_UNIT":"systemd-journald.service","_SYSTEMD_SLICE":"system.slice","_SOURCE_REALTIME_TIMESTAMP":"1639938975788900"}
...

Linux journalctl命令的注意事项

  1. 在使用 journalctl 命令时,如果返回结果为 "bash: journalctl: command not found",则需要确保系统中已经安装了systemd。
  2. journalctl 的日志存储在 /var/log/journal 中,我们需要确保有足够的磁盘空间存储这些日志。

Linux journalctl相关命令

  1. dmesg命令:显示内核信息
  2. tail命令:查看文件尾部内容
0

评论区