Linux Centos mit dmesg Zeitstempel

15

Ich möchte mein Centos 5.x-Dmesg mit Zeitstempel lesen. Wie mache ich das?

Edotan
quelle
Später unterstützt dmesg das -T-Flag. Versuchen Sie es vielleicht mit -T, wenn Ihr dmesg es unterstützt.
Ilansch
Centos 7+ unterstütztdmesg -T
Rogerdpack

Antworten:

12

dmesgLiest 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.logmit 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
Christopher Cashell
quelle
4
Danke für die Antwort. Für jeden, der sucht CentOS 6, Laufen fand ich es in/etc/rsyslog.conf
Safado
Ja, mit CentOS (und RHEL) 6.x haben sie den Standard-Syslog-Daemon von sysklogd auf rsyslog geändert. Es ist auch als (unterstütztes) Paket für RHEL / CentOS 5.x verfügbar.
Christopher Cashell
1
Nun, ich habe dies auf meiner Liste der Dinge, die herausgefunden werden müssen, aber jetzt haben Sie mir ein bisschen
Googeln
8

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
Alex Bozhenko
quelle
das funktioniert bei mir
c4f4t0r
5
Verwenden rc.localist wirklich eine hässliche Lösung dafür (Verwenden rc.localist fast immer eine hässliche Lösung für alles). Eine bessere Lösung wäre, zu setzen printk.time = 1in /etc/sysctl.confoder eine Datei in /etc/sysctl.d/. Aus diesem Grund existieren diese Dateien. Wenn rc.localSie etwas hineindrängen, entsteht schließlich ein zerbrechlicher, verschlungener, chaotischer und unzuverlässiger Start.
Christopher Cashell
Dies, was im Kommentar von @ChristopherCashell steht, ist die einzig richtige Antwort auf diese Frage. Es ist eine Schande, dass es keine tatsächliche Antwort ist.
Petr
1

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. :)

Rächer
quelle
0

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
MDA
quelle
0

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 $_;' 
  • Perl -n ist eine Möglichkeit, Standardeingaben zu lesen und in die Variable $ _ zu lesen.
  • Der Body (nicht der BEGIN-Abschnitt) wird dann für jede Zeile einmal ausgeführt.
  • BEGIN führt den Code einmal in {} aus.
  • $ a ist der Beginn von dmesg seit der Epoche (Sekunden)
  • Der Befehl s / ... nimmt den Wert in $ _ und ersetzt den Teil \ s * #####. ###### des Zeitstempels durch die Version "localtime" des hinzugefügten dmesg-Offsets ($ 1) die Systemstartzeit ($ a)
  • print $ a druckt das dmesg mit dem lokalen Zeitstempel, der den Zeitstempel "Sekunden seit dem Start" ersetzt.
Luigi Bai
quelle
1
Und wie die ursprüngliche Antwort bedarf es einer Erklärung. Können Sie Ihren Beitrag bearbeiten, aufschlüsseln und durchgehen?
Cory Knutson
-1

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.
  • Der Body (nicht der BEGIN-Abschnitt) wird dann für jede Zeile einmal ausgeführt.
  • BEGIN führt den Code einmal in {} aus.
  • $ a ist der Beginn von dmesg seit der Epoche
  • Der Befehl s / ... übernimmt den Wert in $ _ und ersetzt den Teil #####. ###### des Zeitstempels durch die Version "localtime" des dmesg-Offsets ($ 1), die zum Systemstart hinzugefügt wird Zeit ($ a)
  • print $ a druckt das dmesg mit dem lokalen Zeitstempel, der den Zeitstempel "Sekunden seit dem Start" ersetzt.
Howard.TH
quelle
1
Diese Antwort bedarf einer weiteren Erläuterung.
Kasperd
@kasperd Das bedeutet: - Perl -n ist eine Möglichkeit, Standardeingaben zu lesen und in die Variable $ _ zu lesen. Der Body (nicht der BEGIN-Abschnitt) wird dann für jede Zeile einmal ausgeführt. - BEGIN führt den Code einmal in {} aus. $ a ist der Beginn von dmesg seit der Epoche - Der 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 $adruckt das dmesg mit dem für das Gebietsschema geeigneten Zeitstempel, der den Zeitstempel "Sekunden seit dem Start" ersetzt.
Dadinck