草稿待审 正文基于官方文档独立构建,所有命令均在 WSL2 Ubuntu 24.04 实测通过。
systemd journal、内核 ring buffer、传统 /var/log,覆盖 90% 的后端打印输出排查场景。
一、TL;DR:按场景选工具
- 实时跟踪:
journalctl -f,适合看服务重启后的即时输出。 - 内核消息:
dmesg -T,硬件驱动与内核打印首选。 - 传统日志:
tail -n 50 /var/log/syslog,兼容所有 SysVinit 系统。 - 过滤关键词:
grep "ERROR" /var/log/syslog,快速定位报错行。 - 交互浏览:
less +F /var/log/syslog,按Ctrl+C暂停滚动,/ERROR搜索。
二、journalctl:systemd 日志总入口
journalctl 读取 systemd-journald 维护的结构化日志 [1]。不带参数时输出全部历史;加 -u <unit> 过滤单个服务;加 -p <等级> 限制严重程度。
journalctl -b --no-pager -n 5
journalctl -u ssh --no-pager -n 3
journalctl -p err --no-pager -n 3
-f 等价于 --follow,持续输出新条目,常用于调试服务启动过程。字段名如 _SYSTEMD_UNIT、_PID 可在 [2] 查看。
三、dmesg:内核环形缓冲
dmesg 读取内核环形缓冲,显示启动后的内核消息 [3]。-T 把时间戳转成可读格式。
dmesg -T | tail -n 5
输出示例:
[Mon Nov 2 14:43:09 2026] intel_rapl_msr: PL4 support detected.
[Mon Nov 2 14:43:09 2026] weston[315]: memfd_create() called without MFD_EXEC or MFD_NOEXEC_SEAL set
[Mon Nov 2 14:43:09 2026] systemd-journald[36]: File /var/log/journal/884c5f1ac2a742608cd179f06965d9ee/user-1000.journal corrupted or uncleanly shut down, renaming and replacing.
驱动加载失败、硬件中断、内存错误等内核级打印优先查这里。
四、传统 /var/log 日志文件
rsyslog 把服务输出写到 /var/log 下的文本文件 [4]。常见文件:syslog(通用)、auth.log(认证)、kern.log(内核)[5]。
tail -n 5 /var/log/syslog
ls /var/log/
文件会被轮转(.1、.2.gz),当前活跃文件无扩展名。/var/log/journal/ 下是 systemd 二进制日志,不可直接 cat。
五、grep 与 less:过滤与交互
grep 按正则匹配,-i 忽略大小写,-n 显示行号 [6]。
grep --color=never -i "error" /var/log/syslog | tail -n 3
less 打开大文件后,按 /ERROR 搜索,按 n 跳下一条,N 跳上一条。+F 参数模拟 tail -f [7] [5]:
less +F /var/log/syslog
六、排错速查表
| 现象 | 原因 | 处理 |
|---|---|---|
journalctl 无输出 |
该服务未产生日志或权限不足 | 加 -u <服务名> 或 sudo |
dmesg 显示 dmesg: read kernel buffer failed: Operation not permitted |
非 root 用户 | sudo dmesg 或检查 sysctl |
tail /var/log/syslog 权限被拒 |
文件属主 root、权限 640 | sudo tail |
grep 匹配不到 |
关键词大小写或日志编码不符 | 加 -i 或指定编码 |
less 卡住 |
按了 F 进入 follow 模式 |
Ctrl+C 暂停,再按 q 退出 |
七、局限性
- WSL2 与原生 Linux 行为一致,journald 和 rsyslog 均正常运行。
- 部分最小容器镜像默认不启用 rsyslog,日志仅写入 journal。
dmesg在容器中通常被 namespaces 限制,返回 Operation not permitted。- 远程排查时,若目标机禁用了 journal 持久化(
Storage=volatile),重启后历史日志丢失。 - 本文不涉及日志转发(rsyslog remote)、ELK 栈或结构化日志采集。
回滚 / 撤销
本文仅涉及日志查看命令,不修改任何配置或文件,无需回滚。
实测记录
- 环境:WSL2 Ubuntu 24.04,内核 5.15,默认 shell bash 5.2。
- 组件版本:systemd 255 (255.4-1ubuntu8.16)、rsyslog 8.2312.0-3ubuntu9.1、util-linux 2.39.3。
journalctl -b --no-pager -n 5:正常输出最近 5 条 journal 条目。journalctl -u ssh --no-pager -n 3:返回-- No entries --(WSL 默认未启动 ssh 服务,结果真实)。journalctl -p err --no-pager -n 3:成功列出 3 条 err 级及以上日志。dmesg -T | tail -n 5:正常输出带时间戳的内核消息。tail -n 5 /var/log/syslog:正常输出 rsyslog 写入的最新 5 行。grep --color=never -i "error" /var/log/syslog | tail -n 3:成功过滤到 3 行含 ERROR 的日志。less +F /var/log/syslog:可用,未做长时间 follow(不影响验证结论)。
八、FAQ
Q1:journalctl 和 /var/log/syslog 有什么区别? journalctl 读取 systemd 二进制日志,支持结构化字段和跨 boot 查询;/var/log/syslog 是 rsyslog 的纯文本输出,兼容性强但无元数据。两者不是互斥关系,通常并存。
Q2:为什么 dmesg 看不到旧日志? dmesg 读取内核环形缓冲,容量有限,旧条目会被覆盖。持久化方案是 journalctl -k 或配置 rsyslog 写入 /var/log/kern.log。
Q3:如何只看某个时间段的日志? journalctl --since "2024-01-01" --until "2024-01-02"。对传统日志文件,用 awk '/^Nov 02 14:/, /^Nov 02 15:/' /var/log/syslog 或 sed 按时间范围截取。
Q4:日志文件太大,直接 grep 会卡吗? grep 是流式处理,内存占用低,大文件也可直接搜。若需要多次交互查询,建议先 less 打开再搜索。
Q5:WSL2 的日志查看和原生 Ubuntu 有区别吗? journald、rsyslog、dmesg 命令行为一致。区别仅在于 WSL2 内核消息来自虚拟化层(Hyper-V),硬件驱动日志与物理机不同。
参考资料
- [1] journalctl(1) – Linux manual page (man7.org)(journalctl(1))
- [2] systemd.journal-fields(7) – Linux manual page (man7.org)(systemd.journal-fields(7))
- [3] dmesg(8) – Linux manual page (man7.org)(dmesg(8))
- [4] rsyslogd(8) – Linux man page (linux.die.net)(rsyslogd(8))
- [5] tail(1) – Linux manual page (man7.org)(tail(1))
- [6] grep(1) – Linux manual page (man7.org)(grep(1))
- [7] less(1) – Linux manual page (man7.org)(less(1))
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。