dmesg输出可读日期

默认情况下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.
$ 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
[…]