玩 Linux 运维、服务部署的小伙伴,日常最高频的操作一定是排查服务报错。当 Nginx、MySQL、Java 后台服务启动失败、闪退、异常退出时,仅凭 systemctl status 服务名 只能看到简略状态,根本找不到根因。
其实绝大多数现代 Linux 系统(CentOS7+、Ubuntu16.04+)都采用 systemd 日志体系,Systemctl 服务日志的核心工具是 journalctl。今天这篇博文从零讲透 systemctl 服务日志的查看、筛选、实时监控、持久化存储和日志清理,新手也能一键上手!
一、先搞懂:systemctl 日志的核心原理
很多人会混淆 systemctl 和journalctl,这里简单区分:
- systemctl:负责服务的启动、停止、重启、状态查询,仅展示服务简要运行状态和最后几条日志,信息不完整、易截断。
- journalctl:是 systemd 配套的专属日志查询工具,接管所有 systemctl 管理的服务日志,存储完整、支持精准筛选、实时追踪。
传统 Linux 日志多为文本文件(/var/log/ 下),而 systemd 日志默认以二进制格式存储,优势是检索更快、筛选更精准、占用空间更小,缺点是无法直接 cat 查看,必须通过 journalctl 命令解析。
默认日志存储路径:/var/log/journal/
二、基础用法:快速查看服务日志
1. 查看服务简要状态日志(基础)
日常最常用的基础命令,可查看服务当前状态、是否开机自启、最近简短日志:
# 格式:systemctl status 服务名
systemctl status nginx
systemctl status mysqld
默认输出的日志会自动截断,看不到完整报错内容,加上 -l 参数可显示完整日志,无省略:
systemctl -l status nginx
2. 查看服务完整日志(核心)
想要排查详细问题,必须用 journalctl -u 指定服务单元,查看该服务的全部历史日志:
# 查看指定服务所有日志
journalctl -u nginx.service
# 可省略 .service 后缀,效果一致
journalctl -u nginx
3. 同时查看多个服务日志
排查关联服务问题时,可一次性查询多个服务日志:
journalctl -u nginx -u mysql -u redis
三、高阶实操:日志筛选与实时排查(运维高频)
1. 实时滚动监控日志(重点)
服务调试、重启测试时,需要实时查看最新日志,等同于 tail -f 效果,加 -f 参数:
# 实时监控 nginx 日志,终端持续刷新
journalctl -u nginx -f
按 Ctrl+C 即可退出监控模式。
2. 按时间范围精准筛选日志
报错复盘时最实用,可精准定位某一时间段的服务日志,支持相对时间和绝对时间:
# 查看今天所有日志
journalctl -u nginx --since today
# 查看近1小时日志
journalctl -u nginx --since "1 hour ago"
# 查看近30分钟日志
journalctl -u nginx --since "30 min ago"
# 精准时间段:2026-07-30 10:00 至 11:00 的日志
journalctl -u nginx --since "2026-07-30 10:00:00" --until "2026-07-30 11:00:00"
3. 按日志级别筛选(只看报错)
日常排查无需看正常日志,可只筛选错误、警告日志,大幅提升效率:
# 只查看错误级别日志
journalctl -u nginx -p err
# 查看警告+错误日志
journalctl -u nginx -p warning
# 级别优先级:emerg > alert > crit > err > warning > notice > info > debug
4. 查看本次开机后的所有服务日志
# 查看本次系统启动后全部日志
journalctl -b
# 只看本次开机后 nginx 的报错日志
journalctl -u nginx -b -p err
5. 限定输出日志条数
默认输出全部日志,日志量过大时可指定显示最新 N 条:
# 显示最新20条日志
journalctl -u nginx -n 20
四、关键配置:开启日志持久化存储
很多新手会遇到一个问题:服务器重启后,之前的服务日志全部丢失。
原因是 systemd 日志默认临时存储在内存,重启后清空。想要永久保存历史日志,需要手动开启持久化存储。
操作步骤:
1. 编辑 journald 配置文件
vim /etc/systemd/journald.conf
2. 修改 Storage 参数
Storage=volatile:默认,内存存储,重启丢失Storage=persistent:持久化存储,永久保存日志
修改后配置:
[Journal]
Storage=persistent
3. 重启日志服务生效
systemctl restart systemd-journald
设置完成后,服务器重启不会丢失历史服务日志,方便长期问题复盘。
五、日志清理与空间优化
持久化日志会持续占用磁盘空间,长期不清理会导致磁盘爆满,提供两种安全清理方式:
1. 按时间清理(推荐)
# 清理7天前的所有日志,保留近7天日志
journalctl --vacuum-time=7d
# 清理24小时前日志
journalctl --vacuum-time=24h
2. 按空间大小清理
# 限制日志最大占用1G,超出自动清理旧日志
journalctl --vacuum-size=1G
3. 查看日志占用空间
du -sh /var/log/journal/
六、常见问题总结
1. journalctl 日志显示不全、有省略?
使用 systemctl -l status 服务名 或直接用 journalctl 完整查询,避免截断。
2. 重启服务器日志全部清空?
未开启持久化存储,修改 journald.conf 开启 persistent 模式即可。
3. 日志太多,排查效率低?
组合使用 时间筛选 + 日志级别筛选,精准过滤有效报错信息。
七、常用命令速查表
| 需求场景 | 命令 |
|---|---|
| 查看服务简略完整日志 | systemctl -l status 服务名 |
| 查看服务全部历史日志 | journalctl -u 服务名 |
| 实时监控服务日志 | journalctl -u 服务名 -f |
| 查看今日服务日志 | journalctl -u 服务名 –since today |
| 只查看服务错误日志 | journalctl -u 服务名 -p err |
| 查看本次开机所有日志 | journalctl -b |
| 清理7天前日志 | journalctl –vacuum-time=7d |
写在最后
Systemctl + journalctl 是现代 Linux 服务排查的标配组合,告别传统繁琐的文本日志查找,通过精准筛选、实时监控、持久化存储,能极大提升服务报错排查效率。
日常运维中,90% 的服务启动失败、闪退、异常问题,都能通过 journalctl 日志快速定位根源。建议大家熟练掌握这套命令体系,轻松搞定各类服务日志排查!