本文适用于所有使用systemd的Linux发行版,如Debian、Ubuntu、Fedora、CentOS、openSUSE等。
systemd是Linux操作系统之下的一套init程序和基础组件集合,其目标替代传统的System V与BSD风格init程序。systemd支持并行启动服务,并能减少在shell上的系统开销,相比传统的init是一大革新,已被大多数Linux发行版所使用。
按照约定,Linux Kernel加载执行的第一个用户空间程序是/sbin/init
,它的进程ID是1,在使用systemd的系统上,/sbin/init
是一个软链接,指向/lib/systemd/systemd
。
Systemd 是一系列组件的集合,包括热插拔设备管理(udevd)、域名解析(resolved)、时间同步(timesyncd)、日志管理(journald)等。本文介绍一下日志管理。
在计算机远古时代,日志往往被分散在整套系统当中,由不同的守护进程及进程负责处理,很难跨越多种应用程序对其内容进行解读。systemd尝试提供一套集中化管理方案,从而统一打理全部内核及用户级进程的日志信息。这套系统能够收集并管理日志内容,而这也就是我们所熟知的Journal系统。Journal的实现归功于journald守护进程,其负责处理由内核、initrd以及服务等产生的信息。
首先,使用systemctl
命令确认systemd-journald
服务正常工作:
$ systemctl status systemd-journald.service
然后,我们就可以使用journalctl
命令来查看systemd-journald
服务所记录的日志数据。
如果不带任何参数,journalctl
命令将输出所有日志,日志按Page展示,我们可以一页页翻看查找感兴趣的内容。
Tips:如果我们不希望按Page方式展示,而是希望它一股脑地全dump出来,那么可以使用--no-pager
参数,还支持按Json格式输出哟。
-
查看内核日志
journalctl -k
-
查看某次启动的日志
journalctl -b # 等价于 journalctl -b 0,查看最后一次启动的日志 journalctl -b -1 # 查看上一次启动的日志
Tips:使用
journalctl --list-boots
命令可以查看启动记录。 -
跟踪实时日志
journalctl -f
为了提高效率,journalctl
还支持日志过滤,可以按照FIELD=VALUE
格式进行匹配(可以同时添加多个不同字段进行过滤,它们之间是逻辑与的关系)。
-
查看内核日志
journalctl -k
-
查看某次启动的日志
journalctl -b # 等价于 journalctl -b 0,查看最后一次启动的日志 journalctl -b -1 # 查看上一次启动的日志
Tips:使用
journalctl --list-boots
命令可以查看启动记录。 -
跟踪实时日志
journalctl -f
-
按时间进行过滤
可以利用
–since
与–until
参数设定时间段,时间表示方式支持多种格式。对于绝对时间值,可以使用YYYY-MM-DD HH:MM:SS
格式。示例1:查看2015年1月10日17:15之后的日志:
journalctl --since "2015-01-10 17:15:00"
如果以上格式中的某些组成部分未填写,系统会填充默认值:如果日期部分未填写,则默认填充当前日期;如果时间部分未填写,则缺省使用
00:00:00
。示例2:查看2015年1月10日00:00~03:00之间的日志
journalctl --since "2015-01-10" --until "2015-01-11 03:00"
另外,journal还能理解相对值及命名简写,如“yesterday”、“today”、“tomorrow”或者“now”等表达。另外,我们也可以使用“-”或者“+”设定相对值,或者使用“ago”之前的表达。
示例3:查看最近一个小时的日志
journalctl --since "1 hour ago"
-
按服务/组件名称进行过滤
参考
man journalctl
的信息,journalctl -u
或journalctl _SYSTEMD_UNIT=
是过滤某个systemd unit的日志,这里的unit就是systemctl list-units
看到的那些服务。比如:journalctl -u docker.service # 过滤docker运行日志(所有历史日志) journalctl _SYSTEMD_UNIT=udisks2.service
-
按进程ID进行过滤
journalctl _PID=5755
也可以结合
pidof
命令,过滤当前正在运行的某个进程的日志,比如:journalctl _PID=$(pidof dockerd)
-
按用户ID进行过滤
journalctl _UID=1000
除了查看日志,journalctl
还有其他一些用途:
-
查看系统启动记录
journalctl --list-boots
-
查看日志占用的硬盘空间
journalctl --disk-usage
-
清理日志
journalctl --vacuum-size=1G # 仅保留1GB大小的日志,按时间顺序滚动删除 journalctl --vacuum-time=1years # 仅保留近1年的日志
Tips:可通过
/etc/systemd/journald.conf
配置文件来管理systemd-journald
服务的行为。
参考资料: