Ich möchte mein Centos 5.x-Dmesg mit Zeitstempel lesen. Wie mache ich das?
dmesg -T
Ich möchte mein Centos 5.x-Dmesg mit Zeitstempel lesen. Wie mache ich das?
dmesg -T
Antworten:
dmesg
Liest den Kernel Log Ring Buffer. Es werden keine Zeitstempel erstellt. Sie sollten syslog so konfigurieren, dass die Kernel-Protokolle aus diesem Puffer abgerufen und an eine Datei gesendet werden (sofern dies nicht bereits festgelegt wurde). Beachten Sie, dass die standardmäßige CentOS 5.x-Syslog-Konfiguration /var/log/messages
, wie ich mich erinnere, Kernel-Protokolle an sendet .
Wenn Sie alle Kernel-Protokolle (dmesg) /var/log/kern.log
mit dem Standard-Syslog-Daemon an senden möchten , fügen Sie eine Zeile wie die folgende hinzu/etc/syslog.conf
kern.* /var/log/kern.log
/etc/rsyslog.conf
Es gibt die Lösung "Timestamps für dmesg / Kernel Ring Buffer aktivieren"
Sie könnten hinzufügen:
printk.time=1
zum Kernel cmdline.
Was mich betrifft, habe ich rc.local auf allen Maschinen mit Marionette 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
rc.local
ist wirklich eine hässliche Lösung dafür (Verwenden rc.local
ist fast immer eine hässliche Lösung für alles). Eine bessere Lösung wäre, zu setzen printk.time = 1
in /etc/sysctl.conf
oder eine Datei in /etc/sysctl.d/
. Aus diesem Grund existieren diese Dateien. Wenn rc.local
Sie etwas hineindrängen, entsteht schließlich ein zerbrechlicher, verschlungener, chaotischer und unzuverlässiger Start.
Ich habe dieses einfache Skript geschrieben. Ja, es ist langsam. Wenn Sie etwas schneller wollen, schreiben Sie entweder ein Skript auf Perl, Python oder etwas anderem. Ich bin sicher, dieses einfache Skript kann Ihnen Aufschluss darüber geben, wie es berechnet werden kann.
Bitte beachten Sie, dass ich den Sekundenbruchteil, der in jeder Zeile (nach dem. Im Zeitstempel) registriert ist, 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. :)
Skriptänderung für den Fall, dass die Zeile nicht mit einem "[" beginnt
#!/bin/bash
localtime() {
perl -e "print(localtime($1).\"\n\");";
}
upnow=$(cut -f1 -d"." /proc/uptime)
upmmt=$(( $(date +%s) - ${upnow} ))
dmesg \
| while read LINE; do
if [ "$(echo ${LINE} | egrep -v "^\[")" == "" ] ; then
timestamp=$(echo "${LINE}" | sed "s/^\[ *\([0-9]\+\).*/\1/g")
timestamp=$(( ${timestamp} + ${upmmt} ))
echo "${LINE}" | sed "s/^[^]]\+]\(.*\)/$(localtime "${timestamp}") -\1/g"
else
echo "${LINE}"
fi
done
Dies ist ein Update auf Plutoids Vorschlag, bei dem die führenden Leerzeichen aus dem Zeitstempel entfernt werden.
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;'
Ein kleines Perl-Skript wie unten. Es ist ein allgemeiner Weg und ich bin nicht der Autor.
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
perl -n
ist eine Möglichkeit, Standardeingaben zu lesen und in die Variable $ _ zu lesen.s/...
Befehl nimmt den Wert in $ _ und ersetzt den Teil #####. ###### des Zeitstempels durch die "localtime" - Version des dmesg - Offsets ($ 1 ) zur Systemstartzeit hinzugefügt ($ a). - print $a
druckt das dmesg mit dem für das Gebietsschema geeigneten Zeitstempel, der den Zeitstempel "Sekunden seit dem Start" ersetzt.