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命令的注意事项
- 在使用 journalctl 命令时,如果返回结果为 "bash: journalctl: command not found",则需要确保系统中已经安装了systemd。
- journalctl 的日志存储在 /var/log/journal 中,我们需要确保有足够的磁盘空间存储这些日志。
评论区