Linux内核日志级别简介
客观的
本教程的目的是了解各种 Linux 内核日志级别、它们的组织方式,以及如何根据其严重性设置应在控制台上显示哪些消息。
要求
root权限编辑配置文件
困难
简单的
介绍
Linux 内核日志文件的管理是机器管理的一个重要方面:日志可以简单地告诉我们守护进程的状态,或者显示关键消息或警告。在本教程中,我们将看到 Linux 内核使用的各种类型的日志级别、它们如何按严重性组织以及如何根据它过滤控制台上显示的消息。
Linux 内核日志级别
Linux 内核发送的消息基本上可以采用八个日志级别,从 level 0
开始,严重性逐渐降低,直到 level 7
:最低的日志级别标识符,最关键的背景。
当日志级别设置为控制台的默认值时,无论是永久还是临时,它都会充当过滤器,以便仅显示日志级别低于该级别的消息(因此严重性较高的消息)。让我们简单地看看日志级别是如何组织的:
第一个日志级别为 0
,由 KERN_EMERG
字符串标识。这是严重程度最高的级别:它由有关系统不稳定或即将崩溃的消息采用。
日志级别 1
或 KERN_ALERT
紧随其后。此级别用于立即需要用户注意的情况。
按严重性顺序排列的下一个日志级别是KERN_CRIT
,或日志级别2
。此严重级别用于通知与硬件或软件相关的严重错误。
Loglevel 3
,也由 KERN_ERR
字符串标识,它是等级中的下一个。采用此级别的消息通常用于通知用户有关非严重错误,例如失败或有问题的设备识别,或更常见的与驱动程序相关的问题。
KERN_WARNING
或 loglevel 4
它是大多数 Linux 发行版中通常用作默认值的日志级别。此级别用于显示有关非紧急错误的警告或消息。
日志级别 5
为 KERN_NOTICE
。使用此严重级别的消息涉及可能值得注意的事件。
Loglevel 6
它是 KERN_INFO
:这是用于有关内核执行的操作的信息消息的日志级别。
最后,我们还有KERN_DEBUG
,即loglevel 7
,主要用于调试。
如何查看当前默认日志级别
检查我们系统上使用的默认日志级别非常简单。我们所要做的就是检查 /proc/sys/kernel/printk 文件的内容。对于那些不知道的人来说,/proc
它是一个虚拟文件系统
:其中包含的文件实际上并不在磁盘上,而是虚拟文件系统的直观表示。系统状态由内核创建并保存在内存中。在这种情况下,例如我们可以使用上面提到的文件来查询我们系统中设置的默认控制台日志级别的信息。我们所要做的就是运行:
$ cat /proc/sys/kernel/printk
这是命令的典型输出:
4 4 1 7
输出中的第一个值是当前的console_loglevel。这是我们正在寻找的信息:在本例中,值 4
表示当前使用的日志级别。如前所述,这意味着只有严重级别高于该级别的消息才会显示在控制台上。
输出中的第二个值表示 default_message_loglevel
。该值自动用于没有特定日志级别的消息:如果消息未与日志级别关联,则将使用该值。
输出中的第三个值报告 minimum_console_loglevel
状态。它指示可用于console_loglevel的最小日志级别。这里使用的级别是1
,最高。
最后,最后一个值表示 default_console_loglevel
,它是启动时 console_loglevel
使用的默认日志级别。
为了完整起见,我们必须说,也可以使用 sysctl 命令检索相同的信息,运行:
$ sysctl kernel.printk
更改默认控制台日志级别
我们刚刚了解了如何检索有关控制台当前使用的日志级别的信息。在某些情况下,我们可能想要更改该值:让我们看看如何完成此任务。
我们可以使用的最直接的方法是将新值写入 /proc/sys/kernel/printk
文件。然而,这只是一个临时解决方案,新设置不会在计算机重新启动后持续存在。假设我们要将默认控制台日志级别更改为 3
,下面是我们要运行的内容:
$ echo "3" | sudo tee /proc/sys/kernel/printk
或者如果直接使用 root
帐户:
# echo "3" > /proc/sys/kernel/printk
通过查看文件的内容,我们可以验证日志级别现在是我们在命令中指定的级别:
$ cat /proc/sys/kernel/printk
3 4 1 7
我们可以使用 sysctl 命令获得相同的结果:
sudo sysctl -w kernel.printk=3
让我再说一遍:这些都是临时的、非持久的解决方案。要以持久的方式更改默认日志级别,我们必须修改 /etc/default/grub
文件,在启动时将 loglevel
参数传递给内核命令行:
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="loglevel=3 resume=UUID=df5a0685-43f8-433a-8611-57335a10ca8d"
GRUB_DISABLE_RECOVERY="true"
上面是/etc/default/grub文件的内容,并突出显示它是应该添加到GRUB_CMDLINE_LINUX中的参数,其中包含内核命令行指令。在本例中,我们使用了 loglevel=3
,因为我们想为控制台使用该特定日志级别。修改文件并保存更改后,我们必须重新加载 grub,以便在下次重新启动时应用新配置:执行此操作的命令取决于我们正在运行的发行版。一般命令是:
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
在基于 Debian 的发行版上,包装脚本用于基本上执行相同的操作:
$ sudo update-grub
grub 配置将被更新,并且在下次重新启动时,将采用指定的日志级别作为默认值。
结论
在本教程中,我们了解了 Linux 内核日志如何根据其严重性级别进行组织。我们还了解了如何更改默认设置,以便使用相同的条件仅在控制台上显示内核发送的某些消息。最后我们看到了如何使这些更改持久化。