Appearance
systemd 日志管理实战:从 journalctl 到日志排查
systemd 的日志系统 —— journal,收集并存储了来自内核、initrd、服务以及应用的标准输出/错误输出。掌握 journalctl,就是掌握 Linux 故障排查的半壁江山。
1. 基础查看:从全量到分页
bash
# 查看所有日志(默认分页,less模式)
journalctl
# 实时滚动跟踪(类似 tail -f)
journalctl -f
# 倒序显示(最新日志在最前)
journalctl -r
# 限制显示最近100行
journalctl -n 1002. 按时间和启动偏移过滤
时间过滤(支持 -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-boots3. 按单元/进程/优先级过滤
按服务单元:
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 到 notice4. 高级过滤与输出控制
内核与引导消息:
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-journald6. 典型故障排查场景
场景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.log7. 核心元数据字段速查
| 字段 | 含义 |
|---|---|
_PID | 进程ID |
_UID | 用户ID |
_COMM | 命令名(如sshd) |
_SYSTEMD_UNIT | 关联的服务单元 |
PRIORITY | 0-7优先级 |
SYSLOG_FACILITY | syslog设施 |
MESSAGE | 实际日志内容 |
结语
journalctl 是一个结构化日志查询引擎,而非简单的 tail /var/log/syslog。熟练使用上述过滤组合,可以大幅缩短故障定位时间。最后记住两个救命参数:
bash
journalctl -xe # 显示额外信息 + 跳到末尾
journalctl --vacuum-size=500M # 日志紧急瘦身📌 提示:若使用容器环境(docker/podman),它们的日志默认不经过 journal,需单独配置
log-driver=journald。
