具有dmesg时间戳记的Linux Centos


15

我想阅读带有时间戳的Centos 5.x dmesg,该怎么做?


以后的dmesg支持-T标志,如果您的dmesg支持-T标志,则可以尝试使用-T。
ilansch '17

centos 7+支持dmesg -T
rogerdpack

Answers:


12

dmesg读取内核日志环形缓冲区。它不做时间戳记。您应该做的是配置syslog以从该缓冲区中获取内核日志,并将其发送到文件中(如果尚未设置)。注意,/var/log/messages我记得,默认的CentOS 5.x syslog配置将内核日志发送到。

如果您想/var/log/kern.log使用默认的syslog守护程序将所有内核(dmesg)日志发送到,则可以将以下内容添加到/etc/syslog.conf

kern.*                         /var/log/kern.log

4
谢谢你的回答。对于任何正在运行CentOS 6的人,我都在/etc/rsyslog.conf
Safado 2012年

是的,使用CentOS(和RHEL)6.x,他们将默认的syslog守护程序从旧的sysklogd更改为rsyslog。也可以作为RHEL / CentOS 5.x的(受支持的)软件包使用。
Christopher Cashell 2012年

1
好吧,我有这个我的事情搞清楚就行了,但是现在,你救了我一些谷歌上搜索
Safado

8

有解决方案“为dmesg /内核环形缓冲区启用时间戳”

您可以添加:

printk.time=1

到内核​​cmdline。

对于我来说,我已经在所有带有puppet的机器上添加了rc.local。对我来说更容易):

if test -f /sys/module/printk/parameters/time; then
   echo 1 > /sys/module/printk/parameters/time
fi

对我
有用的

5
rc.local为此,使用确实是一个丑陋的解决方案(使用rc.local几乎总是对任何事物的丑陋解决方案)。一个更好的解决办法是把printk.time = 1/etc/sysctl.conf项或文件/etc/sysctl.d/。这就是这些文件存在的原因。塞进东西rc.local最终将使您处于脆弱,混乱,混乱,不可靠的启动状态。
Christopher Cashell14年

@ChristopherCashell的注释中的此内容是对此问题的唯一正确答案。很遗憾,这不是实际答案。
彼得

1

我已经写了这个简单的脚本。是的,很慢。如果您想要更快的速度,则可以在perl,python或其他工具上实际编写脚本。我敢肯定,这个简单的脚本可以让您掌握如何计算的诀窍。

请注意,我忽略了每行中记录的秒分数(在时间戳中的。之后)。

#!/bin/bash
localtime() {
 perl -e "print(localtime($1).\"\n\");";
}

upnow="$(cut -f1 -d"." /proc/uptime)"
upmmt="$(( $(date +%s) - ${upnow} ))"

dmesg | while read line; do
 timestamp="$(echo "${line}" | sed "s/^\[ *\([0-9]\+\).*/\1/g")"
 timestamp=$(( ${timestamp} + ${upmmt} ))
 echo "${line}" | sed "s/^[^]]\+]\(.*\)/$(localtime "${timestamp}") -\1/g"
done

希望对您有所帮助。:)


0

万一行不是以“ [”开头的脚本修改

#!/bin/bash
localtime() {
 perl -e "print(localtime($1).\"\n\");";
}

upnow=$(cut -f1 -d"." /proc/uptime)
upmmt=$(( $(date +%s) - ${upnow} ))

dmesg \
| while read LINE; do
    if [ "$(echo ${LINE} | egrep -v "^\[")" == "" ] ; then
        timestamp=$(echo "${LINE}" | sed "s/^\[ *\([0-9]\+\).*/\1/g")
        timestamp=$(( ${timestamp} + ${upmmt} ))
        echo "${LINE}" | sed "s/^[^]]\+]\(.*\)/$(localtime "${timestamp}") -\1/g"
    else
        echo "${LINE}"
    fi
done

0

这是对Plutoid建议的更新,从时间戳中删除了前导空格。

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;' 
  • perl -n是一种读取标准输入并将其读入变量$ _的方法。
  • 然后,主体(不是BEGIN部分)对于每行运行一次。
  • BEGIN一次运行{}中的代码。
  • $ a是dmesg的开始(从纪元开始)(秒)
  • s / ...命令获取$ _中的值,并将时间戳的\ s * #####。######部分替换为dmesg偏移量($ 1)的“ localtime”版本系统开始时间($ a)
  • print $ a打印dmesg,其中使用区域设置友好的时间戳记代替“自启动后的秒数”时间戳记。

1
和原始答案一样,它需要一些解释。您可以编辑帖子,对其进行分解并逐步进行吗?
Cory Knutson

-1

一些如下的perl脚本。这是一种通用方式,我不是作者。

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
  • perl -n 是一种读取标准输入并将其读入变量$ _的方法。
  • 然后,主体(不是BEGIN部分)对于每行运行一次。
  • BEGIN一次运行{}中的代码。
  • $ a是自时代以来dmesg的开始
  • s / ...命令获取$ _中的值,并将时间戳的#####。######部分替换为dmesg偏移量($ 1)的“ localtime”版本,并将其添加到系统开头时间($ a)
  • print $ a打印dmesg,其中使用区域设置友好的时间戳记代替“自启动后的秒数”时间戳记。

1
这个答案需要更多的解释。
卡巴斯德(Kasperd),2015年

@kasperd这是什么意思:-perl -n是一种读取标准输入并将其读入变量$ _的方法。然后,主体(不是BEGIN部分)对于每行运行一次。-BEGIN一次运行{}中的代码。$ a是dmesg的开始,因为从纪元开始-该s/...命令获取$ _中的值,并将时间戳的#####。######部分替换为dmesg偏移量的“ localtime”版本($ 1 )添加到系统开始时间($ a)。- print $a打印带有区域设置友好时间戳记的dmesg,以替换“自启动后的秒数”时间戳记。
dadinck '16
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.