玩 Linux 运维、服务器排查故障的小伙伴,大概率都有过这样的经历:系统报错后,翻遍 /var/log 目录下的一堆日志文件,messages、secure、服务专属日志混杂在一起,格式不统一、查询繁琐、新旧日志混乱,排查问题效率极低。
从 CentOS 7、Ubuntu 16.04 等新版本系统开始,systemd 接管了系统与服务的所有日志管理工作,而 journalctl 就是配套的日志查询、管理核心工具。它彻底颠覆了传统文本日志的管理模式,统一收集系统内核、系统启动、所有服务、进程的日志,支持精准筛选、时间检索、优先级过滤,是线上故障排查的必备神器。今天就带大家从零吃透 journalctl 的核心用法。
一、什么是 journalctl?核心优势是什么?
journalctl 是 systemd 体系下的统一日志查看工具,所有基于 systemd 启动的进程、系统服务、内核运行日志,都会被 journald 服务统一收集、结构化存储,摒弃了传统分散的文本日志模式。
对比传统 /var/log 日志,它的核心优势非常突出:
- 日志统一归集:内核日志、系统启动日志、所有 systemd 服务日志、用户进程日志全部汇总,无需切换多个日志文件
- 结构化存储:二进制格式存储日志,自带时间戳、进程ID、服务名、日志优先级等元数据,筛选精度远超文本日志
- 灵活筛选能力:支持按时间、服务、PID、日志级别、用户ID 多维度精准过滤
- 持久化可控:支持自动日志轮转、手动清理、日志大小限制,避免磁盘爆满
- 实时监控便捷:替代
tail -f,支持实时刷新日志,适配调试、故障实时排查场景
简单说:所有系统问题,用 journalctl 基本都能一站式查到日志,不用再到处找文件。
二、基础入门:最简常用命令
首先掌握基础用法,快速上手查看系统日志,所有命令默认需要 root 权限,普通用户建议加 sudo 执行。
1. 查看全部系统日志
journalctl
直接执行会输出系统所有归档日志,按时间顺序排列,默认分页展示,支持上下翻页、搜索。
2. 实时监控日志(替代 tail -f)
journalctl -f
高频实用命令!实时刷新最新系统日志,调试服务、复现报错时使用,退出按 Ctrl+C。
3. 查看内核日志(替代 dmesg)
journalctl -k
专门筛选内核层面的日志,排查内核崩溃、硬件异常、驱动故障必备。
4. 查看本次开机所有日志
journalctl -b
-b 代表本次系统启动,只展示开机后的所有日志,过滤掉历史旧日志,专注本次运行状态。
拓展:查看上一次开机的日志(排查开机崩溃、重启故障)
journalctl -b -1
三、核心进阶:精准筛选日志(排查故障核心)
journalctl 最强大的能力就是多维度精准筛选,日常排查服务报错、程序异常,全靠这些命令。
1. 按服务筛选:查看指定服务日志
排查 Nginx、Docker、MySQL、kubelet 等 systemd 服务日志,最常用参数 -u:
# 查看 Nginx 服务日志
journalctl -u nginx.service
# 查看 Docker 服务日志
journalctl -u docker.service
# 组合:本次开机 + 指定服务 + 最新500行
journalctl -b -u nginx -n 500
2. 按时间筛选:定位特定时间段故障
线上故障大多需要回溯特定时间点日志,journalctl 支持人性化时间参数,无需手写时间戳:
# 查看今天所有日志
journalctl --since today
# 查看昨天所有日志
journalctl --since yesterday
# 查看近2小时日志
journalctl --since "2 hours ago"
# 精准时间区间
journalctl --since "2026-07-29 10:00:00" --until "2026-07-29 12:00:00"
# 组合筛选:Nginx 近2天警告及以上日志
journalctl -u nginx --since "2 days ago" -p warning
3. 按日志级别筛选:只看错误、警告
日志优先级从高到低分为 0-7 八个等级,可精准过滤无效日志,只关注报错信息:
- 0:emerg(系统崩溃)
- 1:alert(必须立即处理)
- 2:crit(严重错误)
- 3:err(普通错误,日常排查核心)
- 4:warning(警告信息)
- 5-7:notice、info、debug(普通日志、调试日志)
# 查看本次开机所有错误及以上级别日志
journalctl -b -p err
# 查看上一次开机内核崩溃、错误日志
journalctl -b -1 -p err -k
4. 按进程/用户筛选
排查特定进程、指定用户运行程序的日志:
# 查看指定 PID 进程日志
journalctl _PID=1234
# 查看指定 UID 用户的所有日志
journalctl _UID=1000
四、日志输出格式与可视化
journalctl 支持多种输出格式,适配人工查看、程序解析、日志分析等不同场景,通过 -o 参数切换:
# 默认简短格式(简洁易懂,日常查看首选)
journalctl -o short
# 完整格式(展示所有日志元数据)
journalctl -o verbose
# JSON 格式(结构化数据,适配自动化运维、日志采集)
journalctl -o json
# 格式化 JSON(方便人工查看结构化日志)
journalctl -o json-pretty
# 纯文本格式(只输出日志内容,无多余字段)
journalctl -o cat
同时支持组合过滤,搭配 grep 精准匹配关键词:
# 筛选 Nginx 500 报错日志
journalctl -u nginx | grep "500 Internal Server Error"
五、日志管理:清理、轮转、空间管控
journal 日志默认二进制存储在 /var/log/journal,长期运行会占用大量磁盘空间,必须掌握日志清理与管控方法。
1. 查看日志占用磁盘空间
journalctl --disk-usage
2. 手动清理日志
# 保留最新100M日志,删除旧日志
journalctl --vacuum-size=100M
# 保留近7天日志,删除更早日志
journalctl --vacuum-time=7d
3. 永久配置日志最大占用(推荐)
编辑 journald 配置文件,永久限制日志存储空间,避免磁盘爆满:
# 编辑配置文件
vim /etc/systemd/journald.conf
# 修改以下参数,自定义限制
SystemMaxUse=500M # 日志最大占用500M
SystemMaxFileSize=100M # 单个日志文件最大100M
# 重启服务生效
systemd restart systemd-journald
六、常见问题与实用技巧
1. 日志显示不完整、被截断
默认分页模式会截断长日志,添加参数完整输出:
journalctl --no-pager
2. 无法查看历史归档日志
默认只加载部分日志,添加参数加载全部归档日志:
journalctl -a
3. 开机日志乱序、信息杂乱
搭配排序与搜索,精准定位启动异常:
# 查看本次开机所有服务启动日志
journalctl -b | grep "Starting"
七、总结:日常运维高频命令清单
最后整理一份高频刚需命令,直接收藏复用,覆盖90%运维排查场景:
# 实时监控日志
journalctl -f
# 本次开机错误日志
journalctl -b -p err
# 查看指定服务最新日志
journalctl -u nginx -b -n 300
# 近1天服务报错日志
journalctl -u docker --since "1 day ago" -p err
# 清理过期日志
journalctl --vacuum-size=200M
# 查看磁盘占用
journalctl --disk-usage
写在最后
journalctl 作为 systemd 时代的标准日志工具,相比传统日志体系,极大降低了 Linux 日志排查的门槛,统一、高效、精准是它的最大亮点。熟练掌握时间筛选、服务筛选、日志级别过滤这三大核心能力,基本可以搞定绝大多数服务器故障排查场景。
如果你还在依赖 grep 翻杂乱的文本日志,赶紧切换 journalctl,运维效率会直接翻倍!