发布于2026-05-22 阅读(0)
扫一扫,手机访问
排查服务问题,查看日志是第一步。但在Linux的systemd体系下,用journalctl查服务日志,有几个细节如果没吃透,很容易踩坑,导致查不到、查不全或者效率低下。今天就来聊聊这些容易被忽略的关键点。
-u,且服务名要带 .service直接运行 journalctl -u nginx 大概率会报错或者返回空结果。问题出在哪?关键在于,systemd要求明确指定单元(unit)的类型。正确的写法是 journalctl -u nginx.service。
这里有个常见的误解:我们用 systemctl status nginx 时,可以省略后缀,系统会自动补全。但 journalctl 这个命令可没那么“智能”,它不做任何自动补全。所以,即使你在服务列表里看到的是“nginx”,到了journalctl这里,也必须老老实实加上.service。
如果命令输对了还是查不到,那通常有两种情况:
./nginx 这类方式启动的,那么它的日志就不会进入 journald,自然也就查不到了。所以,高效排查的第一步应该是确认:
systemctl status nginx.service 确认服务确实由systemd管理且在运行。systemctl list-unit-files | grep nginx 来查找。-u参数可以重复使用,比如 journalctl -u sshd.service -u nginx.service。--since 和 --until 时间范围过滤容易忽略时区和格式按时间过滤日志看起来很直观,但细节决定成败。比如这条命令:journalctl --since "2026-04-15 10:00"。看起来没问题,对吧?但它可能会漏掉10:00:00到10:00:59这一分钟内的日志。
为什么?因为默认情况下,时间会被解析为本地时区,并且当你不指定秒时,系统可能会进行截断处理。最稳妥的做法是使用完整的ISO 8601格式:--since "2026-04-15 10:00:00"。
使用“相对时间”虽然方便,但也有一些坑:
--since "1 hour ago":这个时间是动态计算的,基于你执行命令的那一刻,而不是一个固定的时间点。--since today:这里的“today”指的是你本地时区的零点,不是UTC时间。yesterday:它仅仅表示“24小时之前”,而不是日历上的“昨天”。如果你在下午3点查询,--since yesterday 得到的是昨天下午3点至今的日志,而不是从昨天零点开始的。一个小技巧:在构造复杂时间查询前,可以先运行 journalctl -n 1 看一眼最新一条日志的精确时间戳格式和时区,做到心中有数。组合使用 --since 和 --until 通常是最可靠的,例如:journalctl -u nginx.service --since "2026-04-15 09:00:00" --until "2026-04-15 10:00:00"。
-n 行数控制常被误用有没有遇到过这种情况:运行 journalctl -u nginx.service 后,终端开始从几个月前最早的一条日志翻起,而你只想看最近几分钟的错误?这不是命令坏了,而是默认行为就是如此——从最旧的记录开始分页显示。
想直接定位到最新日志,你得掌握几个参数组合:
-n 参数,例如 journalctl -u nginx.service -n 100 只看最后100行。-r(反序)和 -n,比如 journalctl -u nginx.service -r -n 50,这样最新50条日志会优先显示,查看起来非常高效。-f 参数用于实时跟踪日志,它可以和 -n 搭配。执行 journalctl -u nginx.service -n 20 -f 会先打印出最近的20条日志,然后开始持续显示新产生的日志。另外注意两个细节:-n后面如果不跟数字,默认只显示10行;而 --no-pager 参数会禁用分页器,所有日志直接输出到终端,这在需要将日志重定向到文件或用管道处理时很有用,但直接在终端里运行可能会造成刷屏。
这是最让人困惑的情况之一:明明服务昨天运行过,今天用 --since yesterday 却什么也查不到。问题根源很可能在于日志的存储方式。
默认情况下,journald 的日志存储在 /run/log/journal/ 目录下,这个目录位于内存中的临时文件系统(tmpfs)里。也就是说,一旦系统重启,所有日志都会丢失。如果你的系统没有配置持久化存储,那么查询重启前的历史日志注定会失败。
怎么检查?两个命令:
journalctl --disk-usage。如果输出显示“Archived and active journals take up 0B”,基本可以断定持久化未启用。ls -l /var/log/journal/。如果这个目录不存在或者为空,也印证了这一点。启用持久化存储并不复杂,但需要两步操作:
sudo mkdir -p /var/log/journal
sudo chown root:systemd-journal /var/log/journal
sudo chmod 755 /var/log/journal
/etc/systemd/journald.conf,找到 #Storage=auto 这一行,取消注释并将其改为 Storage=persistent。然后重启日志服务:sudo systemctl restart systemd-journald。配置生效后,一个明显的标志是:运行 journalctl --list-boots 命令,你会看到不止当前这次启动(idx 0),还会列出之前几次的启动记录(idx -1, -2 等),这样才能真正回溯历史。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9