在系统运维中,日志排查是定位问题的关键步骤,无论是服务器崩溃、任务启动失败、网络异常,几乎所有问题都能在日志中找到蛛丝马迹。
提到linux日志,一般人首先想到/var/log目录下的messages、secure等文件,但这些传统日志分散且功能有限。而今天要讲的journalctl,作为systemd生态中核心日志管理工具,能轻松整合所有日志,过滤、查询、分析一步到位,堪称linux日志查询神器。
一、journalctl是什么
journalctl是systemd 系统中用于查询和管理日志的核心工具,它直接与systemd-journald服务交互,统一收集内核日志、系统服务日志、应用程序日志甚至用户操作日志,无需手动切换多个日志文件。
默认情况下,journalctl的日志存储在内存中,重启系统后日志会丢失。如果需要持久化存储(部分版本默认已经启用),只需使用root权限执行以下命令:
mkdir -p /var/log/journalsystemctl restart systemd-journald
执行后,日志会默认存储在/var/log/journal/目录下,重启后也不会丢失。
journalctl 的基础用法非常简单,主要是以下三个命令:
1. 查看所有日志
可查看系统所有日志,默认按“从旧到新”的顺序分页显示。
2. 查看最新日志
-n选择查询多少条记录
#查看最近10条日志(默认10条)journalctl -n#查看最近20条日志journalctl -n 5
加上 -r 选项,可倒序显示日志(最新的日志在最前面),适合快速查看最新异常。
3. 实时跟踪日志
journalctl -fjournalctl -f -u sshd #实时监控ssh,成功或者失败都会有记录
按 ctrl + c 可退出实时监控模式。
1. 按时间过滤
用 --since(开始时间)和 --until(结束时间)选项,可指定日志的时间范围,支持绝对时间和相对时间,非常灵活:
#查看今天的所有日志journalctl --since today#查看昨天的日志journalctl --since yesterday #日志是昨天0点到今天现在截止 #查看最近1小时的日志journalctl --since "1 hour ago"#查看指定时间段的日志(绝对时间)journalctl --since "2026-04-20 09:00:00" --until "2026-04-20 21:00:00"
2. 按服务/单元过滤
-u 选项(u = unit,服务单元),可过滤指定服务的所有日志,这是排查服务启动失败、运行异常的核心用法:
#查看网卡服务的所有日志journalctl -u network#查看docker服务今天的错误日志(结合时间和优先级)journalctl -u docker --since today -p err#查看所有以ss*开头的服务日志(支持通配符)journalctl -u ss*
3. 按日志优先级过滤
#查看错误(err)及以上级别的日志,这个使用比较多 journalctl -p err#查看警告(warning)及以上级别的日志journalctl -p warning#查看紧急(emerg)级别的日志(系统严重故障)journalctl -p emerg
日志分为8个优先级(0-7),从高到低依次为emerg(紧急)、alert(警报)、crit(严重)、err(错误)、warning(警告)、notice(通知)、info(信息)、debug(调试)。用 -p 选项,可过滤指定优先级及以上的日志,重点排查错误和警告。
四、日志导出、清理与维护
除了查询日志,journalctl 还支持日志导出、清理、查看磁盘占用等功能,满足日志管理的全场景需求。
1. 导出日志
#导出network服务今天的日志到文本文件journalctl -u network --since today -o short > network-today.log#导出为 JSON格式,在脚本脚本解析中经常使用 journalctl -u network -o json > network.json#导出为格式化JSON,容易阅读 journalctl -u network -o json-pretty > network-pretty.json
2. 查看日志磁盘占用
快速查看 journal 日志占用的磁盘空间。
3. 清理旧日志
#保留最近 100MB的日志journalctl --vacuum-size=100M#保留最近 1个月的日志(删除超出部分)journalctl --vacuum-time=1month#直接删除所有日志,谨慎操作 journalctl --vacuum-time=1s
如果服务器运行较长时间后,日志占用过多磁盘空间时,可通过以上命令清理旧日志。
案例1:nginx 服务启动失败,排查原因
#查看nginx服务最近的错误日志,倒序显示20条journalctl -u nginx.service -p err -r -n 20
案例2:监控 SSH 登录,排查异常登录
# 实时监控SSH服务日志,查看登录情况journalctl -f -u sshd# 查看今天的 SSH 登录失败日志journalctl -u sshd --since today -g "failed"
案例3:系统启动失败,排查启动故障
#查看上一次启动的日志(系统崩溃后)journalctl -b -1#查看上一次启动的错误日志,重点排查故障journalctl -b -1 -p err
六、常见问题
问题1:执行 journalctl 无输出,显示 -- No entries --
解决:检查 systemd-journald 服务是否运行,重启服务即可:
systemctl status systemd-journaldsystemctl restart systemd-journald
若仍无输出,可能是日志未持久化或者程序没有启动或者运行,还没有产生日志。
问题2:普通用户无法查看系统日志
解决:将用户加入 systemd-journal、adm 或 wheel 特权组,或使用root执行 journalctl。
备注:清理日志时需谨慎,避免误删重要日志;导出日志时,建议指定时间范围和服务,避免日志文件过大。
journalctl作为linux系统自带的日志工具,无需额外安装,功能却足够强大。掌握它的基础用法和过滤技巧,能让你在排查系统问题时少走弯路,效率翻倍。更多参数可通过 man journalctl 或 journalctl --help 查看。
如果觉得这篇文章对你日常运维有帮助,欢迎点赞+关注。
#运维#linux运维#journalctl