Vorrei leggere il dmesg di Centos 5.x con il timestamp, come posso fare?
dmesg -T
Vorrei leggere il dmesg di Centos 5.x con il timestamp, come posso fare?
dmesg -T
Risposte:
dmesg
legge 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
/etc/rsyslog.conf
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
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 = 1
in /etc/sysctl.conf
o un file in /etc/sysctl.d/
. Questo è il motivo per cui esistono questi file. Crollare le cose alla rc.local
fine ti lascerà con un avvio fragile, contorto, disordinato e inaffidabile.
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. :)
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
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 $_;'
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 $ _.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 $a
stampa il dmesg con il timestamp amichevole locale sostituito con il timestamp "secondi dall'avvio".