Linux Centos con timestamp dmesg


15

Vorrei leggere il dmesg di Centos 5.x con il timestamp, come posso fare?


successivamente dmesg supporta il flag -T, forse prova a usare -T se il tuo dmesg lo supporta.
Ilansch,

centos 7+ supportadmesg -T
rogerdpack il

Risposte:


12

dmesglegge il buffer dell'anello del registro del kernel. Non esegue i timestamp. Quello che dovresti fare è configurare syslog per catturare 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 si desidera inviare tutti i log del kernel (dmesg) a /var/log/kern.log, usando il demone syslog predefinito, aggiungere una riga come la seguente a/etc/syslog.conf

kern.*                         /var/log/kern.log

4
Grazie per la risposta. Per chiunque stia cercando CentOS 6, l'ho trovato in/etc/rsyslog.conf
Safado

Sì, con CentOS (e RHEL) 6.x, hanno cambiato il demone syslog predefinito dal vecchio sysklogd a rsyslog. È disponibile anche come pacchetto (supportato) per RHEL / CentOS 5.x.
Christopher Cashell,

1
Bene, ho avuto questo nella mia lista di cose da capire, ma ora mi hai salvato un po 'di google
Safado

8

Esiste la soluzione "Abilitazione dei timestamp per dmesg / Kernel Ring Buffer"

È possibile aggiungere:

printk.time=1

al kernel cmdline.

Per quanto mi riguarda, ho aggiunto a rc.local su tutte le macchine con pupazzo. È più facile per me):

if test -f /sys/module/printk/parameters/time; then
   echo 1 > /sys/module/printk/parameters/time
fi

che funziona per me
c4f4t0r,

5
Usare rc.localè davvero una brutta soluzione per questo (usare rc.localè quasi sempre una brutta soluzione a qualsiasi cosa). Una soluzione migliore sarebbe quella di mettere printk.time = 1in /etc/sysctl.confo un file in /etc/sysctl.d/. Questo è il motivo per cui esistono questi file. Crollare le cose alla rc.localfine ti lascerà con un avvio fragile, contorto, disordinato e inaffidabile.
Christopher Cashell,

Questo è ciò che è commentato da @ChristopherCashell è l'unica risposta corretta a questa domanda. È un peccato che non sia una vera risposta.
Petr,

1

Ho scritto questa semplice sceneggiatura. Sì, è lento. Se vuoi qualcosa di più veloce, in realtà scrivi uno script su perl, python o qualcos'altro. Sono sicuro che questo semplice script può darti un'idea di come può essere calcolato.

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


0

La modifica dello script nella riga maiuscola non inizia con un "["

#!/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

0

Questo è un aggiornamento sul suggerimento di Plutone, che rimuove gli spazi iniziali dal timestamp.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;' 
  • perl -n è un modo per leggere l'input standard e leggere nella variabile $ _.
  • Il corpo (non la sezione INIZIO) viene quindi eseguito una volta per ogni riga.
  • BEGIN esegue il codice in {} una volta.
  • $ a è l'inizio di dmesg dall'epoca (secondi)
  • Il comando s / ... prende il valore in $ _ e sostituisce la parte \ s * #####. ###### del timestamp con la versione "localtime" dell'offset dmesg ($ 1) aggiunta a l'ora di inizio del sistema ($ a)
  • print $ a stampa il dmesg con il timestamp locale compatibile con il timestamp "secondi dall'avvio".

1
E come la risposta originale, ha bisogno di alcune spiegazioni. Puoi modificare il tuo post, scomporlo e esaminarlo?
Cory Knutson,

-1

Un piccolo script perl come di seguito. È un modo generale e non sono l'autore.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
  • perl -n è un modo per leggere l'input standard e leggere nella variabile $ _.
  • Il corpo (non la sezione INIZIO) viene quindi eseguito una volta per ogni riga.
  • BEGIN esegue il codice in {} una volta.
  • $ a è l'inizio di dmesg dall'epoca
  • Il comando s / ... prende il valore in $ _ e sostituisce la parte #####. ###### del timestamp con la versione "localtime" dell'offset dmesg ($ 1) aggiunta all'avvio del sistema tempo ($ a)
  • print $ a stampa il dmesg con il timestamp locale compatibile con il timestamp "secondi dall'avvio".

1
Questa risposta ha bisogno di qualche spiegazione in più.
Kasperd,

@kasperd Ecco cosa significa: - perl -n è un modo per leggere l'input standard e leggere nella variabile $ _. Il corpo (non la sezione INIZIO) viene quindi eseguito una volta per ogni riga. - BEGIN esegue il codice in {} una volta. $ a è l'inizio di dmesg dall'epoca - Il s/...comando prende il valore in $ _ e sostituisce la parte #####. ###### del timestamp con la versione "localtime" dell'offset dmesg ($ 1 ) aggiunto all'ora di inizio del sistema ($ a). - print $astampa il dmesg con il timestamp amichevole locale sostituito con il timestamp "secondi dall'avvio".
Dadinck,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.