最有效方法是结合使用 journalctl 与 systemctl:systemctl status 快速查看服务状态、pid 和简略日志,再用 journalctl -u 查看完整日志;支持 -f 实时跟踪、--since 指定时间、-n 行数、-p err 过滤错误、_pid 精准定位,并可通过启用 /var/log/journal 持久化保存日志。

直接用 journalctl 配合 systemctl 查看服务日志最有效,systemctl status 只显示简略状态和最近几行日志,不够详细。
用 journalctl 查看服务完整日志
journalctl 是 systemd 的日志管理工具,所有由 systemd 管理的服务日志都集中在这里。查看某服务的全部日志,运行:
-
journalctl -u servicename.service(例如:journalctl -u nginx.service) - 加
-f实时跟踪日志:journalctl -u nginx.service -f - 加
--since查指定时间后日志:journalctl -u sshd.service --since "2024-05-01" - 加
-n 50只看最近 50 行:journalctl -u docker.service -n 50
结合 systemctl status 快速定位问题
systemctl status 不是查日志主力,但能快速确认服务是否运行、上次启动时间、主进程 PID 和最近几行错误提示:
-
systemctl status nginx—— 显示当前状态、激活时间、主进程、最近 3–4 行日志摘要 - 若看到
Failed或Active: inactive (dead),立刻接journalctl -u nginx --since today查失败原因 - 输出中出现
Process: XXXX ExecStart=...行,说明启动命令执行失败,重点看它下面的日志
过滤和精简日志输出
原始日志可能包含大量无关信息,可用以下方式聚焦关键内容:
- 只看错误级别:
journalctl -u mysql.service -p err(-p支持debug、info、warning、err、crit等) - 按进程 PID 过滤:
journalctl _PID=1234(适合从systemctl status中复制 PID 后追查) - 高亮关键词:
journalctl -u redis.service | grep -i "failed\|error\|timeout" - 导出为文件分析:
journalctl -u httpd.service --since "1 hour ago" > httpd-debug.log
持久化日志与磁盘空间管理
默认 journal 日志只保存在内存或 /run/log/journal(重启丢失)。如需长期保留并避免占满磁盘:
- 启用持久存储:
sudo mkdir -p /var/log/journal,然后sudo systemctl restart systemd-journald - 限制日志大小:
sudo mkdir -p /etc/systemd/journald.conf.d,新建rate-limit.conf,写入: - SystemMaxUse=100M
MaxRetentionSec=2week - 清理旧日志:
sudo journalctl --vacuum-size=200M或--vacuum-time=30d











