如何通过Dmesg-E在Linux中设置内核日志,使其在多个控制台终端实时显示并按优先级排序?
- 内容介绍
- 文章标签
- 相关推荐
本文共计978个文字,预计阅读时间需要4分钟。
mesg+-E + 打开内核消息向控制台(console)的实时打印功能。它仅是启用内核消息向控制台(console)的实时打印功能,并不会更改这个级别。真正决定哪些消息能在终端上显示的,是内核的控制台日志级别(console_loglevel)。内核的控制台日志级别(console_loglevel)决定了哪些消息能在终端上显示。
要让不同控制台终端按需显示不同优先级的日志,核心在于:分别控制各虚拟终端(TTY)的 console_loglevel,并确保目标终端处于活动状态。Linux 默认只将消息输出到当前激活的虚拟控制台(如 Ctrl+Alt+F2),其他 TTY 不会自动收到日志,除非你主动切换或显式设置。
以下是实际可行的操作逻辑和步骤:
控制台日志级别决定“谁能看见什么”
内核用一个整数(0–7)表示控制台最低接收级别:
- 数值越小,要求越严格(只显示更严重的消息)
- 数值越大,显示越宽松(连 debug 都可能出来)
例如:设为4,则emerg(0)到warn(4)会输出,notice(5)及以下不会出现在控制台。
查看当前级别:
cat /proc/sys/kernel/printk # 输出类似:6 4 1 7 → 第一个数字 '6' 就是当前 console_loglevel
启用/禁用某终端的日志输出(用 -E 和 -D)
-
sudo dmesg -E:允许内核消息输出到当前正在使用的控制台(比如你在 tty2,就只对 tty2 生效) -
sudo dmesg -D:禁止该控制台接收新消息
⚠️ 注意:这两个命令不跨终端生效。你在 tty1 执行 dmesg -E,不会让 tty3 突然开始刷日志;它只影响执行时所在的那个终端。
想让多个终端同时看到日志?需要手动切换 + 设置
Linux 内核本身不支持“广播日志到所有 TTY”。但你可以这样模拟多终端可见效果:
-
在每个目标终端(如 tty2、tty3)依次执行:
sudo dmesg -E # 启用本终端输出 sudo dmesg -n 7 # (可选)临时调高本终端接收级别至 debug
-
或者,在某个终端中用
watch实时刷新,再切过去看:watch -n 0.5 'dmesg | tail -n 15'
永久调整默认控制台级别(影响所有新激活终端)
修改 /etc/default/grub,在 GRUB_CMDLINE_LINUX_DEFAULT 中加入 loglevel=:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash loglevel=5"
然后更新并重启:
sudo update-grub && sudo reboot
这样每次启动后,新切换过去的 TTY 默认按 loglevel=5(notice 及以上)显示日志。
补充:为什么 dmesg -n N 常被误用?
dmesg -n N 的作用是设置 console_loglevel(即 /proc/sys/kernel/printk 的第一个值),但它只对当前控制台有效,且某些发行版或内核版本中可能受限(尤其在 systemd 环境下,会被 journal 或 kmsg 接管)。更可靠的方式仍是通过 /proc/sys/kernel/printk 直接写入:
echo "5 4 1 7" | sudo tee /proc/sys/kernel/printk
其中 5 是你要设的 console_loglevel。
不复杂但容易忽略
本文共计978个文字,预计阅读时间需要4分钟。
mesg+-E + 打开内核消息向控制台(console)的实时打印功能。它仅是启用内核消息向控制台(console)的实时打印功能,并不会更改这个级别。真正决定哪些消息能在终端上显示的,是内核的控制台日志级别(console_loglevel)。内核的控制台日志级别(console_loglevel)决定了哪些消息能在终端上显示。
要让不同控制台终端按需显示不同优先级的日志,核心在于:分别控制各虚拟终端(TTY)的 console_loglevel,并确保目标终端处于活动状态。Linux 默认只将消息输出到当前激活的虚拟控制台(如 Ctrl+Alt+F2),其他 TTY 不会自动收到日志,除非你主动切换或显式设置。
以下是实际可行的操作逻辑和步骤:
控制台日志级别决定“谁能看见什么”
内核用一个整数(0–7)表示控制台最低接收级别:
- 数值越小,要求越严格(只显示更严重的消息)
- 数值越大,显示越宽松(连 debug 都可能出来)
例如:设为4,则emerg(0)到warn(4)会输出,notice(5)及以下不会出现在控制台。
查看当前级别:
cat /proc/sys/kernel/printk # 输出类似:6 4 1 7 → 第一个数字 '6' 就是当前 console_loglevel
启用/禁用某终端的日志输出(用 -E 和 -D)
-
sudo dmesg -E:允许内核消息输出到当前正在使用的控制台(比如你在 tty2,就只对 tty2 生效) -
sudo dmesg -D:禁止该控制台接收新消息
⚠️ 注意:这两个命令不跨终端生效。你在 tty1 执行 dmesg -E,不会让 tty3 突然开始刷日志;它只影响执行时所在的那个终端。
想让多个终端同时看到日志?需要手动切换 + 设置
Linux 内核本身不支持“广播日志到所有 TTY”。但你可以这样模拟多终端可见效果:
-
在每个目标终端(如 tty2、tty3)依次执行:
sudo dmesg -E # 启用本终端输出 sudo dmesg -n 7 # (可选)临时调高本终端接收级别至 debug
-
或者,在某个终端中用
watch实时刷新,再切过去看:watch -n 0.5 'dmesg | tail -n 15'
永久调整默认控制台级别(影响所有新激活终端)
修改 /etc/default/grub,在 GRUB_CMDLINE_LINUX_DEFAULT 中加入 loglevel=:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash loglevel=5"
然后更新并重启:
sudo update-grub && sudo reboot
这样每次启动后,新切换过去的 TTY 默认按 loglevel=5(notice 及以上)显示日志。
补充:为什么 dmesg -n N 常被误用?
dmesg -n N 的作用是设置 console_loglevel(即 /proc/sys/kernel/printk 的第一个值),但它只对当前控制台有效,且某些发行版或内核版本中可能受限(尤其在 systemd 环境下,会被 journal 或 kmsg 接管)。更可靠的方式仍是通过 /proc/sys/kernel/printk 直接写入:
echo "5 4 1 7" | sudo tee /proc/sys/kernel/printk
其中 5 是你要设的 console_loglevel。
不复杂但容易忽略

