dmesg、传统日志、journalctl 三者的关系
这是一个从内核到应用,从旧到新的日志体系:
一、三者对比表格
| 对比项 | dmesg | 传统日志 (/var/log/*) | journalctl |
|---|---|---|---|
| 来源 | 内核环形缓冲区 | rsyslog/syslog-ng | systemd-journald |
| 主要内容 | 内核消息、硬件驱动 | 系统服务、应用日志 | 整合所有日志(内核+系统+应用) |
| 存储位置 | 内存(重启清空) | 文本文件(永久) | 二进制文件(/var/log/journal/) |
| 格式 | 纯文本 | 纯文本 | 结构化数据(带字段索引) |
| 查询能力 | 弱(grep) | 弱(grep) | 强(按时间、服务、级别等) |
| 重启后 | 新的启动日志 | 历史保留 | 历史保留(需持久化配置) |
二、数据流向图
┌─────────────┐
内核消息 ───────────→│ dmesg │(内存缓冲区)
└─────────────┘
↓
┌─────────────┐
│ journalctl │←───── 系统服务日志
│ (二进制) │←───── 应用日志
└─────────────┘
↓
┌─────────────┐
│ 传统日志文件 │
│ /var/log/* │(文本文件)
└─────────────┘
三、实际使用场景
1️⃣ dmesg – 只看内核/硬件
# 查看硬件错误
dmesg | grep -i error
# 查看硬盘识别
dmesg | grep sda
# 实时监控内核消息
dmesg -w
2️⃣ 传统日志 – 看特定服务/习惯操作
# 系统消息
tail -f /var/log/messages
# 登录安全
tail -f /var/log/secure
# Nginx日志(应用自己的)
tail -f /www/wwwlogs/access.log
3️⃣ journalctl – 现代系统的万能查询
# 查看所有日志
journalctl
# 实时监控
journalctl -f
# 查看指定服务的日志
journalctl -u nginx.service
# 查看今天的日志
journalctl --since today
# 查看内核日志(相当于dmesg)
journalctl -k
# 查看错误级别日志
journalctl -p err
四、为什么有重叠?
历史原因:
SysV init 时代 → 只有 dmesg + 文本日志
Systemd 时代 → 引入 journalctl(统一收集)
但现在系统为了兼容,三者并存:
- dmesg:快速看硬件
- 文本日志:脚本处理、传统习惯
- journalctl:强大查询、结构化
五、推荐使用策略
| 需求 | 推荐工具 |
|---|---|
| 快速看硬件问题 | dmesg | grep -i error |
| 实时监控系统 | journalctl -f |
| 查某个服务的日志 | journalctl -u nginx.service |
| 导出给其他人 | tail -100 /var/log/messages |
| 查登录失败 | journalctl _COMM=sshd | grep "Failed password" |
| 看今天所有错误 | journalctl --since today -p err |
一句话总结:dmesg 看内核,journalctl 查一切,传统日志做兼容。
实际工作中怎么用?
✅ 推荐用 journalctl 的场景:
bash复制下载
# 查服务日志(最方便) journalctl -u nginx.service -f # 按时间查 journalctl --since "1 hour ago" # 按级别查 journalctl -p err -p warning # 查内核日志 journalctl -k # 组合查询 journalctl -u sshd.service --since today | grep "Failed"
✅ 还得用传统日志的场景:
bash复制下载
# 查Nginx访问日志(应用自己写的) tail -f /www/wwwlogs/access.log # 查MySQL慢查询 tail -f /var/log/mysql/slow-query.log # 给同事发日志(文本文件更方便) cat /var/log/messages | grep error # 脚本处理(grep/awk处理文本更简单)
✅ 还得用 dmesg 的场景:
bash复制下载
# 快速看硬件问题 dmesg | grep -i usb # 系统启动刚完,想看内核消息 dmesg | tail -20
现状总结
text复制下载
journalctl 优势: 结构化、好查询、统一入口 传统日志 优势: 文本格式、脚本友好、应用习惯
实际工作流:
- 日常排查:先用
journalctl -u 服务名 -f - 深入分析:再用
journalctl -p err --since today - 特殊需求:最后找对应应用的日志文件
一句话建议
能记journalctl就记journalctl,但也要知道传统日志在哪——工作中两种都会遇到。
发表回复