Lösung 1:
dmesg
liest den Ringpuffer des Kernel-Protokolls. Es macht keine Zeitstempel. Was Sie tun sollten, ist, Syslog so zu konfigurieren, dass es die Kernel-Protokolle aus diesem Puffer holt und sie an eine Datei sendet (falls dies nicht bereits so eingestellt ist). Beachten Sie, dass die standardmäßige Syslog-Konfiguration von CentOS 5.x Kernel-Protokolle an /var/log/messages
sendet , soweit ich mich erinnere.
Wenn Sie alle Kernel-Protokolle (dmesg) an /var/log/kern.log
senden möchten , würden Sie bei Verwendung des Standard-Syslog-Daemons eine Zeile wie die folgende zu /etc/syslog.conf
hinzufügen
kern.* /var/log/kern.log
Lösung 2:
Es gibt die Lösung "Enabling Timestamps for dmesg/Kernel Ring Buffer"
Sie könnten hinzufügen:
printk.time=1
zur Kernel-Cmdline.
Was mich betrifft, so habe ich rc.local auf allen Rechnern mit Puppet hinzugefügt. Es ist einfacher für mich) :
if test -f /sys/module/printk/parameters/time; then
echo 1 > /sys/module/printk/parameters/time
fi
Lösung 3:
Ich habe dieses einfache Skript geschrieben. Ja, es ist langsam. Wenn Sie etwas schnelleres wollen, schreiben Sie entweder tatsächlich ein Skript für Perl, Python oder etwas anderes. Ich bin sicher, dass dieses einfache Skript Ihnen einen Eindruck davon vermitteln kann, wie es berechnet werden kann.
Bitte beachten Sie, dass ich den in jeder Zeile registrierten Sekundenbruchteil (nach dem . im Zeitstempel) ignoriert habe.
#!/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
Ich hoffe, es hilft. :)