首页 > Sysadmin > 正文

Linux 查看后端输出的 5 种方法

huyuanwen 2026-11-02 Sysadmin

草稿待审 正文基于官方文档独立构建,所有命令均在 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),硬件驱动日志与物理机不同。


参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。