Soluzione 1:
dmesg
legge il buffer circolare del log del kernel. Non fa timestamp. Quello che dovresti fare è configurare syslog per prendere i log del kernel da quel buffer e inviarli a un file (se non è già impostato per farlo). Nota, la configurazione predefinita di CentOS 5.x syslog invia i log del kernel a /var/log/messages
, come ricordo.
Se desideri inviare tutti i log del kernel (dmesg) a /var/log/kern.log
, utilizzando il demone syslog predefinito, aggiungeresti una riga come la seguente a /etc/syslog.conf
kern.* /var/log/kern.log
Soluzione 2:
C'è la soluzione "Abilitazione dei timestamp per dmesg/Kernel Ring Buffer"
Potresti aggiungere:
printk.time=1
al kernel cmdline.
Quanto a me, ho aggiunto a rc.local su tutte le macchine con pupazzo. Per me è più facile) :
if test -f /sys/module/printk/parameters/time; then
echo 1 > /sys/module/printk/parameters/time
fi
Soluzione 3:
Ho scritto questo semplice script. Sì, è lento. Se vuoi qualcosa di più veloce, scrivi effettivamente uno script su perl, python o qualcos'altro. Sono sicuro che questo semplice script può darti un'idea di come può essere calcolato.
Tieni presente che ho ignorato la frazione di secondi registrata in ciascuna riga (dopo il . nel 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
Spero possa essere d'aiuto. :)