Linux嵌入式开发中遇到的一些日志相关问题
linux终端通常不刷屏日志
我linux明明起了很多应用,也有日志打印,为啥没有任何日志显示,只有一个空终端
你看到的终端界面只有空命令行,没有任何应用日志输出,这是Linux 日志输出位置 的典型问题:应用 / 内核的日志默认不会直接打印到当前终端,而是输出到专门的日志文件或系统日志服务中。
📌 为什么看不到日志?
- 日志重定向 :应用启动时,标准输出 / 错误(
stdout/stderr)被重定向到了/dev/null、日志文件或系统日志服务,而不是当前终端。- 系统日志服务接管 :现代 Linux(systemd 系统)的日志由
journald统一管理,应用 / 服务日志不会直接打在终端。- 前台 / 后台差异 :如果应用是后台运行 (
&或 systemd 服务),日志不会出现在当前 shell。🛠️ 查看日志的正确方法
1. 查看 systemd 服务日志(最常用)
如果你的应用是通过
systemd管理的服务:
# 实时查看服务日志(-f 表示 follow,类似 tail -f) journalctl -u 你的服务名.service -f # 查看最近 100 行日志 journalctl -u 你的服务名.service -n 100 # 按时间过滤(今天的日志) journalctl -u 你的服务名.service --since "today"2. 查看应用自身的日志文件
很多应用会将日志写入固定路径,常见位置:
/var/log/下的应用目录(如/var/log/nginx/、/var/log/appname/)- 应用安装目录下的
logs/文件夹- 应用启动时指定的日志文件(如
./app > app.log 2>&1)查看示例:
# 实时查看应用日志 tail -f /var/log/你的应用名.log3. 查看内核 / 驱动日志(dmesg)
如果是内核 / 驱动相关日志:
# 实时查看内核日志 dmesg -w # 过滤蓝牙相关日志 dmesg -w | grep -i bluetooth4. 查看所有系统日志
如果不确定日志归属,直接看全系统日志:
# 实时查看所有日志 journalctl -f5. 前台运行应用(直接看输出)
如果想让日志直接打印到当前终端,前台启动应用:
# 停止后台服务 systemctl stop 你的服务名.service # 前台运行应用,日志直接输出 ./你的应用程序此时所有
stdout/stderr都会打印在当前终端。💡 关键排查点
- 确认应用是否在后台运行 :
ps aux | grep 你的应用名- 确认应用启动脚本 :查看是否有
> /dev/null 2>&1这类重定向语句- 确认系统日志服务 :
systemctl status systemd-journald(必须运行)✅ 总结
- 日志不会自动出现在终端 ,需要通过
journalctl、tail -f或前台启动来查看。- 优先用
journalctl -u 服务名 -f排查服务类应用,用tail -f 日志文件排查自定义日志的应用。
dmesg
dmesg(全称 display message )是 Linux 下查看内核环形缓冲区日志 的命令,专门用来展示内核启动、硬件检测、驱动加载、设备事件等底层信息。它的核心作用是:告诉你内核和硬件到底发生了什么,是排查硬件 / 驱动问题的 "第一入口"。
✨ 核心特点
- 来源:日志来自内核的环形缓冲区(ring buffer),记录内核从启动到当前的所有关键事件。
- 内容 :
- 硬件枚举(CPU、内存、USB、PCIe、蓝牙、Wi-Fi 等设备的检测)
- 驱动加载 / 卸载(比如
btusb、ath9k等驱动的初始化)- 固件加载(比如蓝牙 / 显卡固件是否成功下载到硬件)
- 设备异常(比如硬件断开、驱动报错、资源冲突)
- 特点 :日志不会自动打印到终端,需要用
dmesg主动读取;日志会循环覆盖,旧信息会被新信息顶掉。
🧰 常用命令示例
# 1. 查看所有内核日志(从开机到现在) dmesg # 2. 实时滚动查看新日志(类似 tail -f) dmesg -w # 3. 过滤关键词(比如蓝牙、Wi-Fi、USB) dmesg | grep -i bluetooth dmesg | grep -i wifi dmesg | grep -i usb # 4. 查看最近 50 行日志 dmesg | tail -50 # 5. 带时间戳查看(更易读) dmesg -T
⚠️ 典型应用场景
- 硬件没反应 :比如蓝牙 / USB 设备插了没反应 → 用
dmesg看内核有没有检测到硬件。- 驱动加载失败 :比如
hciconfig提示No such device→ 用dmesg | grep bluetooth看驱动 / 固件是否报错。- 系统崩溃 / 重启:看崩溃前内核打印的错误信息。
- 固件缺失 :比如
dmesg提示Direct firmware load failed→ 说明缺少对应硬件的固件文件。
📊 与其他日志工具的区别
工具 来源 用途 dmesg内核环形缓冲区 内核 / 硬件 / 驱动层调试 journalctlsystemd-journald 系统 / 服务 / 应用层日志(包含内核日志) tail -f /var/log/...应用日志文件 特定应用的业务日志
💡 一句话总结
dmesg就是内核的 "黑匣子" ,所有和硬件、驱动相关的问题,都要先从dmesg开始查。
tail
tail和cat有啥区别?
我用最简单、最直观、一看就懂的方式给你讲清楚:
一句话区别
cat = 一次性把文件全部显示出来 tail = 只显示文件最后几行,还能实时追新加的内容
1. cat 命令
作用:把整个文件从头到尾全部打印出来
cat app.log特点:
- 全部输出
- 不能实时追新日志
- 文件太大时会刷屏,根本看不完
适合:看小文件、看配置文件
2. tail 命令
作用:只看文件最后几行,还能实时跟踪新内容
tail app.log # 只看最后10行 tail -n 20 app.log # 看最后20行 tail -f app.log # 实时追新日志(调试神器!)特点:
- 只看末尾
- -f 可以实时刷新新日志
- 不会刷屏,适合看日志
适合:看运行日志、调试程序、实时输出
最直观的比喻
- cat = 把整本书一页不差全部读给你听
- tail = 只读最后几页,而且新书一出来马上读给你听
你调试蓝牙 / 程序应该用哪个?
一定用 tail -f
tail -f /var/log/app.log因为程序运行时日志一直在增加 ,只有
tail -f能实时看到最新打印。
超级总结
- cat:看全部,静态,不适合日志
- tail :看末尾,-f 实时跟踪,调试必用
tail -F是什么?
tail -F是tail命令的增强版 ,专门用于日志文件被轮转 / 重建时仍能持续跟踪 ,比-f更健壮。
🔍 与
tail -f的核心区别
命令 行为 适用场景 tail -f跟踪当前打开的文件描述符,如果文件被删除 / 重命名 / 重建,会停止更新 临时调试、文件不会被轮转的场景 tail -F跟踪文件名,会定期检查文件是否存在 / 变更,文件重建后自动重新打开 生产环境、日志轮转(logrotate)的长期监控 简单说:
-f:认 "文件句柄",文件没了就停-F:认 "文件名",文件删了重建还能继续追
🧰 常用用法
# 实时跟踪日志,不怕日志被切割/重建 tail -F /var/log/ask_wifi_manager.log # 结合 grep 过滤关键日志 tail -F /var/log/app.log | grep "error" # 显示最后 50 行并实时跟踪 tail -n 50 -F /var/log/app.log
💡 典型场景
- 日志轮转(logrotate) :系统会定期把旧日志改名(如
app.log → app.log.1)并新建app.log,tail -F会自动切换到新文件。- 应用重启重建日志 :应用重启时会清空 / 重建日志文件,
tail -F不会中断。- 长期监控 :比
-f更稳定,适合长时间跑监控脚本。
⚠️ 注意事项
tail -F本质是--follow=name --retry的组合,会有短暂的轮询延迟(默认 1 秒)。- 如果文件被删除且长时间未重建,
tail -F会持续等待,直到文件再次出现。- 调试时临时看日志用
-f足够,长期监控推荐用-F。
✅ 一句话总结
tail -F= 不怕日志文件被删 / 改名 / 重建的 "不死版" 实时日志跟踪,是生产环境调试的首选。
