When you are not using Debian unstable or some kind of Linux distro that hasn’t got the latest version of the dmesg
command, you will not be able to execute ‘dmesg -T
‘ to see human readable timestamp in the output.
A small Perl script does the trick:
#!/usr/bin/perl -wn use strict; foreach my $line (<>) { my ($uptime) = do { local @ARGV='/proc/uptime';<>}; ($uptime) = ($uptime =~ /^(\d+)\./); $line=~/^\[\s*(\d+)\.\d+\](.+)/; printf "[%s]%s\n", scalar localtime(time - $uptime + $1), $2; }
The script itself is actually pretty straightforward: it reads in output from STDIN
and calculates the timestamp based on:
– the first part of the line (which are the seconds since boot)
– reads /proc/uptime
(which contains seconds past since boot)
– takes the current time in seconds (the time()
subroutine)
The output produced looks like:
$ dmesg | perl dmesg.pl | head
[Thu Sep 12 08:15:59 2013] Initializing cgroup subsys cpu
[Thu Sep 12 08:15:59 2013] Initializing cgroup subsys cpuacct
[Thu Sep 12 08:15:59 2013] Linux version 3.10-2-amd64 (debian-kernel@lists.debian.org) (gcc version 4.7.3 (Debian 4.7.3-6) ) #1 SMP Debian 3.10.7-1 (2013-08-17)
[Thu Sep 12 08:15:59 2013] Command line: BOOT_IMAGE=/vmlinuz-3.10-2-amd64 root=/dev/mapper/gams-root ro quiet
[Thu Sep 12 08:15:59 2013] e820: BIOS-provided physical RAM map:
[Thu Sep 12 08:15:59 2013] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
[Thu Sep 12 08:15:59 2013] BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved
[Thu Sep 12 08:15:59 2013] BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
[Thu Sep 12 08:15:59 2013] BIOS-e820: [mem 0x0000000000100000-0x00000000dffeffff] usable
[Thu Sep 12 08:15:59 2013] BIOS-e820: [mem 0x00000000dfff0000-0x00000000dfffffff] ACPI data
Update 12.09.2013: I’ve updated the script
Good idea!
Also in bash:
$ base=$(cat /proc/uptime | cut -d ‘.’ -f1); seconds=`date +%s`; dmesg | sed ‘s/^\[\(.*\)\..*\]\(.*\)$/\1\n\2/’ | while read first; do read second; first=`date +”%d/%m/%Y %H:%M:%S” –date=”@$(($seconds – $base + $first))”`; echo “[$first] $second”; done
Hi
I tried this script on Centos 5.8 and it didn’t worked. It gave error as below with all dmesg line.
Use of uninitialized value in printf at ./dmesg.pl line 7, line 11623.
Here is the dmesg script codes if I am missing somthing here.
#!/usr/bin/perl -wn
use strict;
foreach my $line () {
my ($uptime) = (do { local @ARGV=’/proc/uptime’;} =~ /^(\d+)\./);
$line=~/^\[\s*(\d+)\.\d+\](.+)/;
printf “[%s]%s\n”, scalar localtime(time – $uptime + $1), $2;
}
Hi Mike,
I’ve updated the code snippit, could you test it again? On my Debian it actually works like a charm
Hi Johnny,
Thank You for your reply. Well I am still getting error as below:
Use of uninitialized value in printf at ./dmesg.pl line 7, line 1.
Hi Johnny,
Thank You for your reply. Well I am still getting error as below:
Use of uninitialized value in printf at ./dm-tes.pl line 7, line 1.
Or just:
$ dmesg -T|head
[Sun Jun 8 10:13:52 2014] Initializing cgroup subsys cpuset
[Sun Jun 8 10:13:52 2014] Initializing cgroup subsys cpu
[Sun Jun 8 10:13:52 2014] Linux version 3.2.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.6.3 (Debian 4.6.3-14) ) #1 SMP Debian 3.2.57-3+deb7u2
[Sun Jun 8 10:13:52 2014] Command line: BOOT_IMAGE=/boot/vmlinuz-3.2.0-4-amd64 root=UUID=2c60bbd2-7b5d-4f30-a4f0-dcea4410b5f7 ro quiet
[Sun Jun 8 10:13:52 2014] BIOS-provided physical RAM map:
[Sun Jun 8 10:13:52 2014] BIOS-e820: 0000000000000000 – 000000000009dc00 (usable)
[Sun Jun 8 10:13:52 2014] BIOS-e820: 000000000009f800 – 00000000000a0000 (reserved)
[Sun Jun 8 10:13:52 2014] BIOS-e820: 00000000000f0000 – 0000000000100000 (reserved)
[Sun Jun 8 10:13:52 2014] BIOS-e820: 0000000000100000 – 00000000bafc0000 (usable)
[Sun Jun 8 10:13:52 2014] BIOS-e820: 00000000bafc0000 – 00000000bafc3000 (ACPI NVS)
Yes … but when I wrote this blog post (and code snippit), the option wasn’t available 😉 At least not in the version of Debian Squeeze
Very good! well done.