Skip to content

systemd 日志管理实战:从 journalctl 到日志排查

systemd 的日志系统 —— journal,收集并存储了来自内核、initrd、服务以及应用的标准输出/错误输出。掌握 journalctl,就是掌握 Linux 故障排查的半壁江山。

1. 基础查看:从全量到分页

bash
# 查看所有日志(默认分页,less模式)
journalctl

# 实时滚动跟踪(类似 tail -f)
journalctl -f

# 倒序显示(最新日志在最前)
journalctl -r

# 限制显示最近100行
journalctl -n 100

2. 按时间和启动偏移过滤

时间过滤(支持 -S/--since-U/--until):

bash
# 今日凌晨至今
journalctl --since="today"

# 过去1小时
journalctl --since="1 hour ago"

# 精确时间范围
journalctl --since="2024-03-20 10:00:00" --until="2024-03-20 11:00:00"

启动偏移

bash
# 当前这次启动的日志
journalctl -b

# 上一次启动的日志
journalctl -b -1

# 列出所有启动序号
journalctl --list-boots

3. 按单元/进程/优先级过滤

按服务单元

bash
journalctl -u nginx.service
journalctl -u nginx -u php-fpm    # 多单元联合

按PID/用户

bash
journalctl _PID=1234
journalctl _UID=1000

按优先级(类似syslog level):

bash
# emerg(0) alert(1) crit(2) err(3) warning(4) notice(5) info(6) debug(7)
journalctl -p err               # 仅错误及以上
journalctl -p 3..5              # err 到 notice

4. 高级过滤与输出控制

内核与引导消息

bash
journalctl -k            # 仅内核日志
journalctl --dmesg       # 同上
journalctl --grep="OOM"  # 正则过滤消息内容

输出格式

bash
journalctl -o json-pretty   # JSON 格式,便于脚本处理
journalctl -o cat           # 仅消息正文,无元数据
journalctl -o verbose       # 显示所有字段

5. 日志维护与持久化

默认 journal 是易失性的(存在 /run/log/journal,重启丢失)。若需持久化:

bash
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald

空间限制(修改 /etc/systemd/journald.conf):

ini
SystemMaxUse=2G
MaxFileSec=1month

应用配置后:

bash
sudo systemctl restart systemd-journald

6. 典型故障排查场景

场景1:服务突然挂了,没来得及看日志

bash
# 查看上次启动直到当前时刻的日志
journalctl -u myapp.service -b -1

场景2:系统OOM,但dmesg已滚动

bash
journalctl -k --grep="Out of memory"

场景3:SSH登录失败排查

bash
journalctl -u sshd --since="1 hour ago" -p 3..5

场景4:导出日志供离线分析

bash
journalctl -u mysql --since="yesterday" > mysql_issue.log

7. 核心元数据字段速查

字段含义
_PID进程ID
_UID用户ID
_COMM命令名(如sshd)
_SYSTEMD_UNIT关联的服务单元
PRIORITY0-7优先级
SYSLOG_FACILITYsyslog设施
MESSAGE实际日志内容

结语

journalctl 是一个结构化日志查询引擎,而非简单的 tail /var/log/syslog。熟练使用上述过滤组合,可以大幅缩短故障定位时间。最后记住两个救命参数:

bash
journalctl -xe      # 显示额外信息 + 跳到末尾
journalctl --vacuum-size=500M   # 日志紧急瘦身

📌 提示:若使用容器环境(docker/podman),它们的日志默认不经过 journal,需单独配置 log-driver=journald

最后更新2026/06/06 06:12
如果你觉得这篇文章有帮助,或者想聊聊技术、工作,欢迎通过下面方式联系我:
contact fishfinal