Linux Centos with dmesg timestamp

38,496

Solution 1

dmesg reads the Kernel log ring buffer. It doesn't do timestamps. What you should do is configure syslog to grab the kernel logs from that buffer and send them to a file (if it isn't already set to do so). Note, default CentOS 5.x syslog config sends kernel logs to /var/log/messages, as I recall.

If you'd like to send all kernel (dmesg) logs to /var/log/kern.log, using the default syslog daemon, you'd add a line like the following to /etc/syslog.conf

kern.*                         /var/log/kern.log

Solution 2

There is solution "Enabling Timestamps for dmesg/Kernel Ring Buffer"

You could add:

printk.time=1

to kernel cmdline.

As for me, I have added to rc.local on all machines with puppet. It's easier for me) :

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

Solution 3

I've written this simple script. Yes, it's slow. If you want something faster you either actually write a script on perl, python or something else. I'm sure this simple script can give you the hang of how it can be calculated.

Please note I ignored the seconds fraction registered in each line (after the . in the timestamp).

#!/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

I hope it helps. :)

Share:
38,496

Related videos on Youtube

edotan
Author by

edotan

Updated on September 18, 2022

Comments

  • edotan
    edotan almost 2 years

    I would like to read my Centos 5.x dmesg with timestamp, how do I do this?

    • ilansch
      ilansch almost 7 years
      later dmesg support the -T flag, maybe try using -T if your dmesg supports it.
    • Giraffe
      Giraffe over 5 years
      centos 7+ supports dmesg -T
  • Safado
    Safado about 12 years
    Thank you for the answer. For anyone looking that's running CentOS 6, I found it in /etc/rsyslog.conf
  • demonkoryu
    demonkoryu about 12 years
    Yep, with CentOS (and RHEL) 6.x, they changed the default syslog daemon from the old sysklogd to rsyslog. It's available as a (supported) package for RHEL/CentOS 5.x, too.
  • Safado
    Safado about 12 years
    Well, I've had this on my list of things to figure out, but now you've saved me some googling
  • c4f4t0r
    c4f4t0r about 10 years
    that works for me
  • demonkoryu
    demonkoryu about 10 years
    Using rc.local is really kind of an ugly solution for this (using rc.local is almost always an ugly solution to anything). A better solution would be to put printk.time = 1 into /etc/sysctl.conf or a file in /etc/sysctl.d/. That's the reason these files exist. Cramming stuff into rc.local will eventually leave you with a fragile, convoluted, messy, unreliable start-up.
  • dadinck
    dadinck over 8 years
    @kasperd Here is what it means: - perl -n is a way to read standard input and read into variable $_. The body (not the BEGIN section) is then run once for each line. - BEGIN runs the code in {} once. $a is the start of dmesg since the epoch - The s/... command takes the value in $_ and substitutes the #####.###### part of the timestamp with the "localtime" version of the dmesg offset ( $1) added to the system start time ($a). - print $a prints the dmesg with the locale friendly time stamp substituted for the "seconds since boot" time stamp.
  • Petr
    Petr over 7 years
    This what is in comment from @ChristopherCashell is the only correct answer to this question. It's a shame it's not actual answer.
  • Cory Knutson
    Cory Knutson almost 7 years
    And like the original answer, it needs some explanation. Can you edit your post, break it down, and step through it?