如何阻止内核消息淹没控制台?


45

我正在使用Centos 6,rsyslog日志记录。控制台充满了内核消息。

  • Klogd未运行(我正在使用rsyslog)
  • Rsyslog配置不会将任何内容定向到控制台
  • 甚至尝试完全停止rsyslog

不过东西是充斥我的控制台内核日志消息。它是什么,如何使它停止?

更新:这些是由内核(硬件,iptables等)生成的消息,这些消息已经消失了/proc/kmsg,像这样:

Shorewall:pub2loc:DROP:IN = br0 OUT = MAC = xxx SRC = xxx DST = xxx LEN = 60 TOS = 0x00 PREC = 0x00 TTL = 128 ID = 15731 DF PROTO = TCP SPT = 63767 DPT = 3493 WINDOW = 8192 RES = 0x00 SYN URGP = 0


消息是什么样的?(个人而言,我通常在xterm窗口中工作,所以如果控制台被淹没,也不会打扰我。)
Keith Thompson

冒着明显的危险,这些消息来自Shorewall(我从未使用过,所以我无济于事)。添加Shorewall防火墙标签可能会得到更多有用的注意。
基思·汤普森

@KeithThompson:消息通过内核日志记录机制发送。Shorewall只是这些消息的产生者之一(通过iptables内核模块),最令人讨厌的是,但是其中显示了所有内核生成的消息。
2011年

Answers:


27

我建议你改变一下/etc/sysctl.conf。具体来说,您想调整kernel.printk行。

# Uncomment the following to stop low-level messages on console
kernel.printk = 3 4 1 3

我不确定centos的默认设置是什么,但是似乎设置的内容比您需要的更详细。

另请参见有关日志记录的“ 岸壁”部分。您不必使用LOG目标进行日志记录,可以使用其他工具,也可以调整日志的严重性,并进行调整以控制消息的发送位置。


32

要在运行时设置值,请使用sysctl。(我想人们也可以/proc/sys/kernel/printk直接写信,显然您也可以dmesg -n CUR按照此处的描述使用)

显示:

# sysctl kernel.printk
kernel.printk = 2       4       1       7

输出中的分隔符是单个选项卡,顺便说一句。

组。这里的分隔符只是空格。也可以。

# sysctl -w kernel.printk="2 4 1 7"
kernel.printk = 2 4 1 7
# sysctl kernel.printk
kernel.printk = 2       4       1       7

有关更多信息,请参见man sysctl“在运行时配置内核参数”。

提醒上面的Brian给出的严重性级别和kernel.printk的四个值:

  • CUR =当前严重级别;仅打印比此级别更重要的消息
  • DEF =分配给无级别消息的默认严重性级别
  • MIN =最小允许CUR
  • BTDEF =引导时默认CUR

在我的CentOS上:7 4 1 7

                     CUR  DEF  MIN  BTDEF
0 - emergency        x              x                        
1 - alert            x         x    x
2 - critical         x              x
3 - error            x              x
4 - warning          x    x         x
5 - notice           x              x
6 - informational    V              V
7 - debug            

这太吵了,我只想要关键和向上(没有错误)。未标记的消息应被视为警告,因此DEF很好:

                     CUR  DEF  MIN  BTDEF
0 - emergency        x              x                        
1 - alert            x         x    x
2 - critical         x              x
3 - error            V              V
4 - warning               x         
5 - notice                           
6 - informational                   
7 - debug            

设置为:3 4 1 3


4
man klogctl还说明了水平。
Ciro Santilli新疆改造中心法轮功六四事件

12

我发现这也有帮助。在基于RHEL的发行版上,您可以cat /proc/sys/kernel/printk查看当前设置。

在printk文件中找到四个值。这些值中的每一个都定义了不同的规则来处理错误消息。第一个值称为控制台日志级别,它定义了打印到控制台的消息的最低优先级。(请注意,优先级越低,日志级别数越高。)第二个值设置未附加明确日志级别的消息的默认日志级别。第三个值为控制台日志级别设置最低的日志级别配置。最后一个值设置控制台日志级别的默认值。

不再支持在/ etc / sysconfig / init中使用LOGLEVEL参数来设置控制台日志级别。要在Red Hat Enterprise Linux 6中设置控制台日志级别,请将loglevel ='作为引导时间参数。例如,loglevel = 6将打印所有小于6(不等于小于)的消息。

归功于:


6

根据RedHat的说法,这是“官方”方式:

要在Red Hat Enterprise Linux 6中设置控制台日志级别,请将loglevel = <number>作为启动时间参数传递。



0

您将看到打印到控制台的内核日志消息。到达控制台的日志消息取决于当前设置的控制台日志级别。

当内核cmdline包含quiet内核参数时,结果控制台日志级别为4(即错误且更糟)。没有它,它将设置为7(即信息更糟)。

您可以使用查看活动的内核参数,cat /proc/cmdline并使用查看当前控制台日志级别sysctl kernel.printk。可以使用dmesg -n X(甚至使用sysctl -w)动态更改。

要使更改永久生效,您可以将内核参数添加到内核cmdline(例如quiet和/或loglevel=X)或.conf在下添加sysctl 文件/etc/sysctl.d

可以这样添加kernel参数:

# vi /etc/default/grub # edit the GRUB_CMDLINE_LINUX value
# for i in /boot/grub2/grub.cfg /boot/efi/EFI/*/grub.cfg; do
     [ -f "$i" ] && grub2-mkconfig -o "$i" ; done

0

由于这是一个与堆栈溢出相关的站点,因此我首先要说您不应该关闭输出,而应该解决错误。

如果您在控制台中,但由于出现消息而看不到您在做什么,请尝试键入此内容。

须藤dmesg -D

这应该使其足够安静以查看其他解决方案。


-1

如果您遇到了真正的麻烦,则可以在出现大量洪水而无法正确查看或键入任何内容的情况下暂时禁用syslog服务。


问题是已经尝试了停止syslog守护程序,而这还不够
Toby Speight
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.