默认情况下dmesg输出的时间信息是启动后的时间并不是日期格式,有些发行版的linux使用dmesg -T或者–ctime可以自动进行转化,但是centos6并不支持该选项,需要进行转换才行,脚本如下:
# desired date format date_format="%a %b %d %T %Y" # uptime in seconds uptime=$(cut -d " " -f 1 /proc/uptime) # run only if timestamps are enabled if [ "Y" = "$(cat /sys/module/printk/parameters/time)" ]; then dmesg | sed "s/^\[[ ]*\?\([0-9.]*\)\] \(.*\)/\\1 \\2/" | while read timestamp message; do printf "[%s] %s\n" "$(date --date "now - $uptime seconds + $timestamp seconds" +"${date_format}")" "$message" done else echo "Timestamps are disabled (/sys/module/printk/parameters/time)" fi但是还有一种情况是会丢失timestamp这个字段,这个需要修改内核参数才行。
echo Y | sudo tee /sys/module/printk/parameters/time[原文](https://blog.sleeplessbeastie.eu/2013/10/31/how-to-deal-with-dmesg-timestamps/)如下: ==========================================================
By default `dmesg` command print kernel ring buffer using timestamp for each logged message. It is easy to change this behavior and display date/time in human readable form using just one additional parameter but sometimes it is not supported so I will shortly touch upon this topic.
Read
To enable logging timestamps write
Log test message and verify
$ dmesg [...] [ 1.028871] Linux agpgart interface v0.103 [ 1.028940] agpgart-intel 0000:00:00.0: Intel Sandybridge Chipset [ 1.028999] agpgart-intel 0000:00:00.0: detected gtt size: 2097152K total, 262144K mappable [ 1.029857] agpgart-intel 0000:00:00.0: detected 65536K stolen memory [...]
How to convert timestamps to human readable form?
The easiest way is to use -T
or --ctime
parameter.
$ dmesg -T [...] [Sat Oct 19 12:43:26 2013] Linux agpgart interface v0.103 [Sat Oct 19 12:43:26 2013] agpgart-intel 0000:00:00.0: Intel Sandybridge Chipset [Sat Oct 19 12:43:26 2013] agpgart-intel 0000:00:00.0: detected gtt size: 2097152K total, 262144K mappable [Sat Oct 19 12:43:26 2013] agpgart-intel 0000:00:00.0: detected 65536K stolen memory [...]
What if above-mentioned parameters are not supported?
Sometimes you will encounter linux distribution in which such conversion is not supported but it can be easily implemented using the following shell script.
#!/bin/bash # Translate dmesg timestamps to human readable format # desired date format date_format="%a %b %d %T %Y" # uptime in seconds uptime=$(cut -d " " -f 1 /proc/uptime) # run only if timestamps are enabled if [ "Y" = "$(cat /sys/module/printk/parameters/time)" ]; then dmesg | sed "s/^\[[ ]*\?\([0-9.]*\)\] \(.*\)/\\1 \\2/" | while read timestamp message; do printf "[%s] %s\n" "$(date --date "now - $uptime seconds + $timestamp seconds" +"${date_format}")" "$message" done else echo "Timestamps are disabled (/sys/module/printk/parameters/time)" fi
What if timestamps are missing?
Rarely you will find that timestamps are missing from the dmesg
output.
$ dmesg
[…]
Bluetooth: RFCOMM TTY layer initialized
Bluetooth: RFCOMM socket layer initialized
Bluetooth: RFCOMM ver 1.11
[…]
Read
/sys/module/printk/parameters/time
file to confirm that timestamps are disabled.
$ cat /sys/module/printk/parameters/time
N
To enable logging timestamps write
Y
to the above-mentioned file.
$ echo Y | sudo tee /sys/module/printk/parameters/time
This change will not be permanent as it will last until reboot. To make it permanent add
printk.time=1
parameter to grub options.Log test message and verify
dmesg
output to check out changes.$ echo “Enabled timestamps” | sudo tee /dev/kmsg
$ dmesg
[…]
Bluetooth: RFCOMM TTY layer initialized
Bluetooth: RFCOMM socket layer initialized
Bluetooth: RFCOMM ver 1.11
[…]
[271309.434405] Enabled timestamps
[…]
转载请注明来源链接 http://just4fun.im/2017/04/04/dmesg-e8-be-93-e5-87-ba-e5-8f-af-e8-af-bb-e6-97-a5-e6-9c-9f/ 尊重知识,谢谢:)