我想用时间戳阅读我的CentOS 5.x dmesg,我该怎么做?
dmesg读取内核日志环形缓冲区。 它不会做时间戳。 你应该做的是configuration系统日志从该缓冲区获取内核日志,并将它们发送到一个文件(如果它尚未设置这样做)。 注意,默认CentOS 5.x syslogconfiguration发送内核日志到/var/log/messages ,我记得。
如果您想要将所有内核(dmesg)日志发送到/var/log/kern.log ,使用默认的syslog守护进程,则可以在/etc/syslog.conf添加如下所示的行
kern.* /var/log/kern.log
有解决scheme“启用dmesg /内核环缓冲区的时间戳”
你可以添加:
printk.time=1
到内核cmdline。
至于我,我已经在所有机器上join了rc.local。 对我来说更容易):
if test -f /sys/module/printk/parameters/time; then echo 1 > /sys/module/printk/parameters/time fi
我写了这个简单的脚本。 是的,速度很慢 如果你想要更快的东西,你要么写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
我希望它有帮助。 🙂
情况行中的脚本修改不以“[”
#!/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
这是Plutoid的build议更新,从时间戳中删除前导空格。
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;'
一个小Perl脚本如下。 这是一个普遍的方式,我不是作者。
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
perl -n是读取标准input并读入variables$ _的一种方法。