首页 > 编程笔记 > Linux笔记 阅读:2

Linux journalctl命令用法详解(附带实例)

system.journal 文件是二进制形式的(中间的乱码是当前计算机的机器唯一ID,每个人的都不一样),使用 vim 查看是乱码,那么这个日志就只能使用对应的命令查看,这个命令就是 journalctl 命令。

journalctl 命令的基本格式如下:
[root@localhost ~]# journalctl [选项] [匹配关键字]
选项:
journalctl 命令还可以按照时间查看日志,按照时间查看日志的选项相对较多,我们通过举例来详细讲解。

journalctl查看所有日志

在系统中,直接执行 journalctl 命令,可以查看 systemd-journald.service 服务记录的所有日志(当然只会记录此次启动之后产生的日志,重启系统之前的日志已经丢失了),具体命令如下:
[root@localhost ~]# journalctl
#查看所有日志
3 月 06 15:33:38 localhost kernel: Linux version 5.14.0-162.6.1.el9_1.0.1.x86_64 (mockbuild@dal1-prod-buildero01.bld.equ.rockylinux.org>
3 月 06 15:33:38 localhost kernel: The list of certified hardware and cloud instances for Enterprise Linux 9 can be viewed at the Red>
3 月 06 15:33:38 localhost kernel: Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.14.0-162.6.1.el9_1.0.1.x86_64 root=UUID=60ff6727-f0>
3 月 06 15:33:38 localhost kernel: x86/fpu: Supporting XSAVE feature 0x001: x87 floating point registers
...省略部分内容...

journalctl 命令查看的日志是分页显示的,可以在此页面中执行一下交互命令:
journalctl 命令的交互命令和 vim 的命令模式类似,相对好记忆。

journalctl 命令也可以通过“-n”选项,指定查看最新日志的条数,命令如下:
[root@localhost ~]# journalctl -n 5
3 月 06 16:29:33 localhost.localdomain dnf[1310]: Rocky Linux 9-Extras 213 B/s | 2.9 kB 00:14
3 月 06 16:29:33 localhost.localdomain dnf[1310]: 元数据缓存已建立
3 月 06 16:29:33 localhost.localdomain systemd[1]: dnf-makecache.service: Deactivated successfully
3 月 06 16:29:33 localhost.localdomain systemd[1]: Finished dnf makecache
3 月 06 16:29:33 localhost.localdomain systemd[1]: dnf-makecache.service: Consumed 2.735s CPU time.

journalctl查看内核相关日志

journalctl 命令可以使用“-r”选项,查看内核相关日志,具体命令如下:
[root@localhost ~]# journalctl -r
3 月 07 16:29:28 localhost.localdomain systemd[1]: Failed to start dnf makecache
3 月 07 16:29:28 localhost.localdomain systemd[1]: dnf-makecache.service: Failed with result 'exit-code'
3 月 07 16:29:28 localhost.localdomain dnf[1893]:  - Curl error (6): Couldn't resolve host name for http://mirror.nju.edu.cn/rocky/9.>
3 月 07 16:29:28 localhost.localdomain dnf[1893]: Errors during downloading metadata for repository "baseos":
3 月 07 16:29:28 localhost.localdomain dnf[1893]: Rocky Linux 9-BaseOS 0.0 B/s | 0 B 00:13
3 月 07 16:29:14 localhost.localdomain systemd[1]: Starting dnf makecache...
(其余内容省略)
当然,在所有日志的结果中,刚刚学习过的日志交互命令都可以使用,如翻页、搜索等。

journalctl按照服务名或进程PID来查看日志

我们可以按照服务名,查看指定服务的日志,具体命令如下:
[root@localhost ~]# journalctl -u sshd
3 月 06 15:33:43 localhost systemd[1]: Starting OpenSSH server daemon...
3 月 06 15:33:43 localhost sshd[675]: Server listening on 0.0.0.0 port 22
3 月 06 15:33:43 localhost sshd[675]: Server listening on :: port 22
3 月 06 15:33:43 localhost systemd[1]: Started OpenSSH server daemon
3 月 06 15:33:50 localhost.localdomain sshd[1058]: Accepted password for root from 192.168.112.1 port 57898 ssh2
3 月 06 15:33:50 localhost.localdomain sshd[1058]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)

当然也可以依赖进程 PID 来查看指定的日志,具体命令如下:
[root@localhost ~]# journalctl _PID=1
3 月 06 15:33:39 localhost systemd[1]: Starting Create Volatile Files and Directories...
3 月 06 15:33:39 localhost systemd[1]: Finished Create Volatile Files and Directories
3 月 06 15:33:39 localhost systemd[1]: Finished Setup Virtual Console
3 月 06 15:33:39 localhost systemd[1]: dracut ask for additional cmdline parameters was skipped because all trigger condition checks failed
3 月 06 15:33:39 localhost systemd[1]: Starting dracut cmdline hook...
(其余内容省略)

journalctl按照用户UID查看某用户产生的日志

可以按照用户的 UID 来查看指定用户产生的日志,具体命令如下:
[root@localhost ~]# journalctl _UID=1000
3 月 07 16:12:42 localhost.localdomain passwd[1686]: pam_unix(passwd:chauthtok): authentication failure logname= uid=1000 euid=0 tty=>
3 月 07 16:12:53 localhost.localdomain passwd[1689]: pam_unix(passwd:chauthtok): authentication failure logname= uid=1000 euid=0 tty=>
(其余内容省略)
注意,日志尾部如果有“=>”,就代表日志一行没显示完整,可以通过小键盘“→”键查看剩余日志信息。

journalctl按照日志警告级别查看日志

使用 journalctl 命令的“-p”选项可以查看指定级别的日志,日志级别用 0 至 7 代表,分别表示:"emerg"(0)、"alert"(1)、"crit"(2)、"err"(3)、"warning"(4)、"notice"(5)、"info"(6)、"debug"(7)。

日志级别所对应的数字越小,代表此日志的危险等级越高,我们要警惕 0 至 4 级别的日志,如果出现,那么一般需要人为排除相关故障。

笔者在写作时使用的是虚拟机做实验,没有找到 0 至 2 级别的报错日志,这是好事。但是,不幸的是,笔者在查询“err”(3)级别日志时,系统出现报错信息,具体命令如下:
[root@localhost ~]# journalctl -p 3
3 月 06 15:33:41 localhost kernel: piix4_smbus 0000:00:07.3: SMBus Host Controller not enabled!
这个报错是系统内核没有正确加载“piix4_smbus”模块的驱动导致的,如果严重就会影响系统启动,是需要人为修复的错误。修复此错误不属于本章的内容,就不在这里演示了。

通过这个小意外,相信大家能感受到 journalctl 日志的重要性。笔者建议,应通过脚本定期检测 journalctl 日志中的危险级别日志,如果发现了,就需要人为干预。

journalctl按照日期和时间查看日志

journalctl 命令也可以按照日期和时间查看日志,几种常用的时间格式如下:
[root@localhost ~]# journalctl --since "2024-3-6"               # 指定日期之后
[root@localhost ~]# journalctl --since "2024-3-6 15:30:00"      # 指定日期时间之后
[root@localhost ~]# journalctl --since "2024-3-6 12:00:00" --until "2024-3-6 15:30:00"   # 指定时间段
[root@localhost ~]# journalctl --since yesterday                # 昨天的日志
按照日期和时间查询日志还是比较灵活的,可以形成各种时间组合,在系统帮助中也有一些例子,大家可以参考。

按照日期和时间查询日志在实际工作中还是比较实用的,因为服务器在一般情况下会有监控程序,用于监控服务器的日常运行。如果监控程序报警,我们就会明确地知道服务器是在哪个时间点出现的故障,这时再查看这段时间的日志,就可以分析到底是什么原因引起了这个故障。

journald 服务的配置文件保存在 /etc/systemd/journald.conf 中,这个文件主要用于日志的持久化存储,也就是永久保存在硬盘之中的。当前系统的 journald 服务的持久化存在一些小故障,笔者推荐还是使用 rsyslogd 服务来永久保存日志。这个配置文件,我们暂时不讲解了。

相关文章