掘金 后端 ( ) • 2024-04-17 16:39

在 CentOS 7 系统中,journalctl 是一个强大的命令行工具,用于查询和分析由 systemd-journald 服务收集的系统日志。systemd-journaldsystemd 系统和服务管理器的一部分,负责日志的收集、存储和转发。本文将深入探讨如何使用 journalctl 进行日志查询,以及如何配置和管理 systemd-journald 服务以优化日志系统的性能和存储。

精确匹配日志记录

journalctl 支持使用字段和值的格式 FIELD=VALUE 来精确匹配日志记录。例如,要查询 crond.service 的日志,可以使用以下命令:

[root@master ~]# journalctl _SYSTEMD_UNIT=crond.service

日志记录包含多个字段,如 MESSAGEMESSAGE_ID_PID_UID_HOSTNAME_SYSTEMD_UNIT 等。这些字段可以通过 man systemd.journal-fields 查看。

应用多个匹配条件

当需要对同一字段应用多个匹配条件时,可以连续使用匹配字段:

[root@master ~]# journalctl _SYSTEMD_UNIT=crond.service _SYSTEMD_UNIT=docker.service

组合多个匹配条件

使用 + 符号可以对多个匹配字段执行操作:

[root@master ~]# ps -ef|grep crond
fengji       535 38453  0 14:32 pts/2    00:00:00 grep --color=auto crond
fengji      9639     1  0 May15 ?        00:00:19 /usr/sbin/crond -n

# 匹配PID执行
[root@master ~]# journalctl _PID=9639
# 多个匹配字段执行操作
[root@master ~]# journalctl _PID=9639 + _SYSTEMD_UNIT=docker.service

日志持久化存储

systemd-journald 服务默认将日志保存在 /run/log 目录中,系统重启后日志将丢失。为了持久化保存日志,可以采用以下两种方法:

  1. 创建 /var/log/journal 目录并重启日志服务。
  2. 修改 /etc/systemd/journald.conf 配置文件,将 Storageauto 改为 persistent,然后重启日志服务。

创建持久化存储目录

[root@master ~]# sudo mkdir /var/log/journal
[root@master ~]# sudo chown root:systemd-journal /var/log/journal
[root@master ~]# sudo chmod 2775 /var/log/journal
[root@master ~]# sudo systemctl restart systemd-journald.service

日志数据清理

journalctl 提供了 -vacuum-size-vacuum-time 选项来清理日志数据,帮助管理磁盘空间。

按大小清理日志

# 查看日志占据的磁盘空间
[root@master ~]#  sudo journalctl --disk-usage
# 清理日志
[root@master ~]#  sudo journalctl --vacuum-size=1G

按时间清理日志

[root@master ~]# sudo journalctl --vacuum-time=1d

配置日志容量限制

通过编辑 /etc/systemd/journald.conf 文件,可以设置以下参数来限制日志所能占用的最高容量和日志数据体积的膨胀速度:

  • SystemMaxUse:指定 journal 所能使用的最高持久存储容量。
  • SystemKeepFree:指定 journal 在添加新条目时需要保留的剩余空间。
  • SystemMaxFileSize:控制单一 journal 文件大小。
  • RuntimeMaxUse:指定易失性存储中的最大可用磁盘容量。
  • RuntimeKeepFree:指定向易失性存储内写入数据时为其它应用保留的空间量。
  • RuntimeMaxFileSize:指定单一 journal 文件可占用的最大易失性存储容量。

查看指定时间段的日志

使用 --since--until 选项设定时间段,可以查询特定时间范围内的日志记录。时间值可以使用多种格式,包括相对时间(如 yesterdaytodaytomorrownow)。

查询特定时间点后的日志

[root@master ~]# sudo journalctl --since "2018-03-26 20:20:00"

获取昨天的日志数据

[root@master ~]# sudo journalctl --since yesterday

获取特定时间段内的日志

[root@master ~]# sudo journalctl --since 09:00 --until "1 hour ago"

过滤特定 unit 的日志

使用 -u 选项可以通过 unit 名称过滤器日志记录:

[root@master ~]# sudo journalctl -u docker.service --since today

实时查看日志更新

journalctl 支持 -f 选项,用于实时查看日志更新,类似于 tail -f 命令:

[root@master ~]# sudo journalctl -f

控制输出格式

重定向到标准输出

使用 --no-pager 选项可以将输出重定向到标准输出,方便后续文本处理:

[root@master ~]# sudo journalctl --no-pager

格式化输出结果

使用 -o 选项可以格式化输出结果,支持多种格式,包括 shortverbosejson 等:

[root@master ~]# sudo journalctl -u docker.service -n 1 --no-pager -o json

查看内核日志

使用 -k 选项可以查看内核日志:

[root@master ~]# sudo journalctl -k

优化 journald 配置

为了优化 journald 的性能和存储,可以创建配置文件 /etc/systemd/journald.conf.d/99-prophet.conf 并设置相关参数:

cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
Storage=persistent
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
SystemMaxUse=1G
SystemMaxFileSize=10M
MaxRetentionSec=2week
ForwardToSyslog=no
EOF

systemctl restart systemd-journald.service
systemctl enable systemd-journald.service

通过上述配置,可以确保日志数据的合理存储和清理,同时保持系统的高效运行。