Linux 日志神器 journalctl 完全指南
适用环境:CentOS 7+、RHEL 7+、Ubuntu 16.04+、Debian 8+ 等基于 systemd 的发行版
在现代 Linux 中,systemd 统一管理系统与服务,配套的 journalctl 负责集中查看日志。
不必再分别翻 /var/log/messages、/var/log/secure、各业务目录下的零散文本日志,用一套命令即可按服务、时间、级别精准排查。
一、journalctl 是什么?
1.1 工作原理
- journalctl 是 systemd 的日志查看前端。
- 日志写入
/var/log/journal/(持久化开启时),为结构化二进制,带服务名、PID、UID、级别、时间戳等元数据。 - 比纯文本
grep更适合按维度过滤、按开机批次回溯。
1.2 核心优势
| 能力 | 说明 |
|---|---|
| 统一管理 | 系统、内核、systemd 服务、多数守护进程日志一处查看 |
| 精准过滤 | 按服务、时间、级别、进程、用户筛选 |
| 开机回溯 | 可查本次/上次开机日志,排查启动失败 |
| 实时监控 | 类似 tail -f |
| 容量可控 | 可限制占用、按时间/大小清理,避免打满磁盘 |
1.3 和传统日志的关系
| 方式 | 典型路径 | 适用 |
|---|---|---|
| journalctl | /var/log/journal/ | systemd 服务、系统级排查首选 |
| 传统文本 | /var/log/messages、nginx/access.log 等 | 应用自己写文件的业务日志仍要看应用目录 |
说明: Nginx/Java 若配置了独立 access/error 文件,仍要看对应文件;journalctl -u nginx 主要看 systemd 托管该服务时 打到 journal 的内容。
二、基础用法
2.1 查看全部日志
journalctl
默认分页:
空格:翻页回车:下一行q:退出- 不想分页:加
--no-pager
2.2 倒序(最新在前)
journalctl -r
2.3 最近 N 行
journalctl -n # 默认约 10 行
journalctl -n 100 # 最近 100 行
2.4 实时跟踪(高频)
journalctl -f
journalctl -u your-app.service -f
三、精准过滤(生产必备)
3.1 按服务(最常用)
# 指定 unit
journalctl -u nginx.service
journalctl -u sshd.service -f
# 多个服务
journalctl -u nginx -u mysql
# 先看状态,再查日志
systemctl status nginx.service
journalctl -u nginx.service -n 200 -p err
服务名以 systemctl list-units --type=service 为准,大小写与名称要准确。
3.2 按时间
journalctl --since today
journalctl --since "1 hour ago"
journalctl --since yesterday --until today
journalctl --since "2026-09-01 10:00:00" --until "2026-09-01 12:00:00"
也可使用相对写法,例如:--since "2 days ago"。
3.3 按级别
优先级从低到高:
debug < info < notice < warning < err < crit < alert < emerg
journalctl -p err # err 及以上
journalctl -p warning # warning 及以上
journalctl -u nginx --since "1 hour ago" -p err
-p / --priority 表示「该级别及更严重」。
3.4 按开机批次
journalctl --list-boots # 开机列表
journalctl -b # 本次开机
journalctl -b -1 # 上一次开机(排查重启前)
journalctl -b -2
3.5 内核 / 用户 / 进程
journalctl -k # 内核(类似 dmesg)
journalctl _UID=0 --since today # root
journalctl _PID=1234 # 指定进程
journalctl _COMM=java # 按进程名(若有记录)
常用字段还可配合:_SYSTEMD_UNIT=、SYSLOG_IDENTIFIER= 等(-o verbose 可看到字段)。
四、输出格式
journalctl -u nginx -o cat # 只要正文
journalctl -u nginx -o short-iso # 带 ISO 时间,便于对齐
journalctl -u nginx -o json-pretty # JSON,方便脚本
journalctl -o verbose # 全字段,疑难排查
导出时建议加 --no-pager,避免交互分页:
journalctl -u nginx --since today -p err --no-pager > nginx-error.log
五、持久化、清理与容量控制
5.1 重启后日志是否还在?
若 Storage=volatile 或未建持久目录,重启可能丢 journal。建议:
# 编辑
sudo vim /etc/systemd/journald.conf
关键项示例:
[Journal]
Storage=persistent
SystemMaxUse=500M
SystemMaxFileSize=100M
# 可选:按时间保留
# MaxRetentionSec=1month
生效:
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald
5.2 手动清理
sudo journalctl --vacuum-size=100M # 总占用压到约 100M
sudo journalctl --vacuum-time=7d # 只留近 7 天
sudo journalctl --vacuum-time=1month
sudo journalctl --disk-usage # 查看当前占用
5.3 导出备份
journalctl -u nginx --since today -p err --no-pager > nginx-error-$(date +%F).log
journalctl -u myapp.service --since "2026-09-14" --until "2026-09-15" -o export > myapp.journal
六、生产场景速用
# SSH 登录相关错误(实时)
sudo journalctl -u sshd -f -p err
# Nginx 近 1 小时错误(新日志在前)
sudo journalctl -u nginx --since "1 hour ago" -p err -r --no-pager
# 上次开机启动失败
sudo journalctl -b -1 -p err
# 今日严重错误
sudo journalctl --since today -p crit
# 自定义业务服务实时日志
sudo journalctl -u myserver.service -f
# Java/Spring Boot 若用 systemd 托管
sudo journalctl -u ai-risk-control.service -n 300 -p err --no-pager
sudo journalctl -u ai-risk-control.service --since "30 min ago" -f
标准排查顺序:
systemctl status 服务名journalctl -u 服务名 -n 200 -p err- 不够再放大时间或去掉
-p,必要时-o verbose
七、Java / 自建服务注意点
- 必须用 systemd unit 管理,日志才会稳定进 journal(
StandardOutput=journal/StandardError=journal,或默认继承)。 - 应用若只写
logs/sys-info.log,journalctl 看不到业务文件日志,仍要tail/less应用目录。 - 可同时:
journalctl -u xxx看启动/崩溃,应用 log 看业务堆栈。 - 权限:系统级筛选常需
sudo;普通用户可能只能看自己会话相关日志。
示例 unit 片段(示意):
[Service]
Type=simple
User=app
WorkingDirectory=/opt/app
ExecStart=/usr/bin/java -jar /opt/app/app.jar
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp
八、常见踩坑
| 问题 | 处理 |
|---|---|
| 普通用户查不到 | 加 sudo,或把用户加入 systemd-journal / adm 组(视发行版而定) |
| 重启后日志没了 | Storage=persistent,并确保 /var/log/journal 存在 |
| 分页卡住、不好复制 | 加 --no-pager |
-u 无输出 | 核对 systemctl status 真实 unit 名 |
和 /var/log/xxx 对不上 | 应用可能写了独立文件,两边都要查 |
| 磁盘暴涨 | SystemMaxUse + 定期 --vacuum-* |
九、命令速查表
| 命令 | 作用 |
|---|---|
journalctl | 全部日志(分页) |
journalctl -r | 倒序,最新在前 |
journalctl -n 100 | 最近 100 行 |
journalctl -f | 实时跟踪 |
journalctl -u 服务名 | 按服务 |
journalctl -p err | 错误及以上 |
journalctl -b / -b -1 | 本次 / 上次开机 |
journalctl -k | 内核日志 |
journalctl --since "1 hour ago" | 时间范围 |
journalctl -o cat / json-pretty | 输出格式 |
journalctl --disk-usage | 占用空间 |
journalctl --vacuum-size=100M | 按大小清理 |
journalctl --vacuum-time=7d | 按时间清理 |
journalctl --no-pager | 不分页直接输出 |
十、推荐记忆组合
日常排障优先记住:
服务(-u) + 时间(--since) + 级别(-p) + 实时(-f) + 不分页(--no-pager)
示例:
sudo journalctl -u nginx --since "1 hour ago" -p err -f
覆盖绝大多数生产故障的第一轮排查;再按需结合应用自身日志文件深入分析。
131



被折叠的 条评论
为什么被折叠?



