关于Linux中的日志问题

Linux嵌入式开发中遇到的一些日志相关问题

linux终端通常不刷屏日志

我linux明明起了很多应用,也有日志打印,为啥没有任何日志显示,只有一个空终端

你看到的终端界面只有空命令行,没有任何应用日志输出,这是Linux 日志输出位置 的典型问题:应用 / 内核的日志默认不会直接打印到当前终端,而是输出到专门的日志文件或系统日志服务中。

📌 为什么看不到日志?

  1. 日志重定向 :应用启动时,标准输出 / 错误(stdout/stderr)被重定向到了 /dev/null、日志文件或系统日志服务,而不是当前终端。
  2. 系统日志服务接管 :现代 Linux(systemd 系统)的日志由 journald 统一管理,应用 / 服务日志不会直接打在终端。
  3. 前台 / 后台差异 :如果应用是后台运行& 或 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/你的应用名.log

3. 查看内核 / 驱动日志(dmesg)

如果是内核 / 驱动相关日志:

复制代码
# 实时查看内核日志
dmesg -w

# 过滤蓝牙相关日志
dmesg -w | grep -i bluetooth

4. 查看所有系统日志

如果不确定日志归属,直接看全系统日志:

复制代码
# 实时查看所有日志
journalctl -f

5. 前台运行应用(直接看输出)

如果想让日志直接打印到当前终端,前台启动应用

复制代码
# 停止后台服务
systemctl stop 你的服务名.service

# 前台运行应用,日志直接输出
./你的应用程序

此时所有 stdout/stderr 都会打印在当前终端。

💡 关键排查点

  • 确认应用是否在后台运行ps aux | grep 你的应用名
  • 确认应用启动脚本 :查看是否有 > /dev/null 2>&1 这类重定向语句
  • 确认系统日志服务systemctl status systemd-journald(必须运行)

✅ 总结

  • 日志不会自动出现在终端 ,需要通过 journalctltail -f 或前台启动来查看。
  • 优先用 journalctl -u 服务名 -f 排查服务类应用,用 tail -f 日志文件 排查自定义日志的应用。

dmesg

dmesg(全称 display message )是 Linux 下查看内核环形缓冲区日志 的命令,专门用来展示内核启动、硬件检测、驱动加载、设备事件等底层信息。

它的核心作用是:告诉你内核和硬件到底发生了什么,是排查硬件 / 驱动问题的 "第一入口"。


✨ 核心特点

  • 来源:日志来自内核的环形缓冲区(ring buffer),记录内核从启动到当前的所有关键事件。
  • 内容
    • 硬件枚举(CPU、内存、USB、PCIe、蓝牙、Wi-Fi 等设备的检测)
    • 驱动加载 / 卸载(比如 btusbath9k 等驱动的初始化)
    • 固件加载(比如蓝牙 / 显卡固件是否成功下载到硬件)
    • 设备异常(比如硬件断开、驱动报错、资源冲突)
  • 特点 :日志不会自动打印到终端,需要用 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

⚠️ 典型应用场景

  1. 硬件没反应 :比如蓝牙 / USB 设备插了没反应 → 用 dmesg 看内核有没有检测到硬件。
  2. 驱动加载失败 :比如 hciconfig 提示 No such device → 用 dmesg | grep bluetooth 看驱动 / 固件是否报错。
  3. 系统崩溃 / 重启:看崩溃前内核打印的错误信息。
  4. 固件缺失 :比如 dmesg 提示 Direct firmware load failed → 说明缺少对应硬件的固件文件。

📊 与其他日志工具的区别

工具 来源 用途
dmesg 内核环形缓冲区 内核 / 硬件 / 驱动层调试
journalctl systemd-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 -Ftail 命令的增强版 ,专门用于日志文件被轮转 / 重建时仍能持续跟踪 ,比 -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

💡 典型场景

  1. 日志轮转(logrotate) :系统会定期把旧日志改名(如 app.log → app.log.1)并新建 app.logtail -F 会自动切换到新文件。
  2. 应用重启重建日志 :应用重启时会清空 / 重建日志文件,tail -F 不会中断。
  3. 长期监控 :比 -f 更稳定,适合长时间跑监控脚本。

⚠️ 注意事项

  • tail -F 本质是 --follow=name --retry 的组合,会有短暂的轮询延迟(默认 1 秒)。
  • 如果文件被删除且长时间未重建,tail -F 会持续等待,直到文件再次出现。
  • 调试时临时看日志用 -f 足够,长期监控推荐用 -F

✅ 一句话总结

tail -F = 不怕日志文件被删 / 改名 / 重建的 "不死版" 实时日志跟踪,是生产环境调试的首选。

相关推荐
linux修理工2 小时前
ip a 命令解析与 IP 地址提取
linux·服务器·php
万象.2 小时前
Linux网络层相关知识及报文格式
linux·网络·智能路由器
穷途末路程序员2 小时前
linux设备驱动程序框架(进阶1)——利用udev自动生成设备文件
linux
程序猿编码2 小时前
轻量又灵活:一款伪造TCP数据包的iptables扩展实现解析(C/C++代码实现)
linux·c语言·网络·c++·tcp/ip·内核·内核模块
_OP_CHEN2 小时前
【Linux网络编程】(二)计算机网络概念进阶:彻底搞懂协议本质、传输流程与封装分用
linux·运维·服务器·网络·网络协议·计算机网络·c/c++
风曦Kisaki2 小时前
# 云计算基础Day06:Linux权限管理
linux·云计算
勇闯逆流河2 小时前
【Linux】linux进程概念(fork,进程状态,僵尸进程,孤儿进程)
linux·运维·服务器·开发语言·c++
牛十二2 小时前
宝塔安装openclaw+企业微信操作手册
linux·运维·服务器
开开心心_Every2 小时前
免费抽奖软件支持内定名单+防重复中奖
linux·运维·服务器·edge·pdf·c5全栈·c4python