Linux Centos 带有 dmesg 时间戳

Linux Centos 带有 dmesg 时间戳

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

答案1

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

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

kern.*                         /var/log/kern.log

答案2

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

您可以添加:

printk.time=1

到内核​​命令行。

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

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

答案3

我写了这个简单的脚本。是的,它很慢。如果你想要更快,你可以用 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

我希望它有帮助。:)

答案4

下面是一个小的 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/... 命令获取 $_ 中的值,并将时间戳的 #####.###### 部分替换为添加到系统启动时间 ($a) 的 dmesg 偏移量的“本地时间”版本($1)
  • print $a 打印 dmesg,用区域友好时间戳替换“自启动以来的秒数”时间戳。

相关内容