单元日志怎么找
systemctl status 默认只显示最后几行日志,定位问题时明显不够。标准动作是组合使用:status 看单元状态与最近的日志片段,journalctl -u 取该单元的完整日志,再按时间窗口与关键字过滤。要留意两类差异:服务若自己写文件日志,systemd 侧只有启停记录,应用错误得去文件里找;日志级别是 info 的错误用 -p err 过滤会漏,过滤前先确认日志的真实级别。
基本信息
| 适用平台 | Linux(systemd 与 journald) |
|---|---|
| 命令组合 | systemctl status 单元 + journalctl -u 单元 |
| 常用选项 | -n 行数 --since 与 --until 时间窗口 -p 优先级 -b 启动轮次 -f 实时跟踪 --no-pager 不分页 |
| 日志来源 | systemd 采集进程输出;应用自行写文件日志时不会进入 journal |
| 权限说明 | 读取系统 journal 需要 root 或加入 systemd-journal 等对应组 |
典型使用场景
- 服务启动失败,定位是配置错误还是依赖未就绪
- 运行中偶发报错,回溯发生前后的上下文
- 对比上一次启动与本次启动的日志差异
- 实时跟踪服务输出,配合复现操作定位问题
- 确认应用日志究竟输出到 journal 还是文件
标准动作
标准动作
systemctl status myapp --no-pager -l
journalctl -u myapp -n 200 --no-pager
journalctl -u myapp --since '15 min ago' | grep -iE 'error|fail|exception' | tail -n 30
journalctl -u myapp -b -1 -p err # 上一次启动的错误级别日志
journalctl -u myapp -f # 实时跟踪
systemctl cat myapp | grep -E 'ExecStart|StandardOutput|StandardError'常用查询组合
| 需求 | 命令 | 说明 |
|---|---|---|
| 看当前状态 | systemctl status 单元 | 含活动状态、退出码与最近的日志片段 |
| 看更多日志 | journalctl -u 单元 -n 200 | 默认输出行数很少,需显式指定行数 |
| 按时间对齐 | journalctl -u 单元 --since | 与变更时间点对齐,快速锁定引入问题的操作 |
| 按启动轮次 | journalctl -u 单元 -b -1 | 查看上一次开机以来的日志 |
| 实时观察 | journalctl -u 单元 -f | 复现故障时同步查看输出 |
只看 status 的最后几行往往不够,崩溃点常常更早。建议从 -n 200 起步,再按时间窗口与关键字逐步收敛。
服务若自行写文件日志,journal 中只有启停记录。先用 systemctl cat 查看 ExecStart 与输出重定向配置,确定应用日志的实际路径。
journal 默认可能只保存在内存(/run/log/journal),重启后本轮日志全部丢失。需要跨重启保留,要在 journald.conf 里开启持久化存储并确认磁盘容量足够。
日志量大的服务可用 journalctl --since 与 --until 精确圈定窗口,再配合 -o short-precise 或 -o json 输出,便于与变更时间或脚本解析对齐。