Řešení 1:
dmesg
čte kruhovou vyrovnávací paměť protokolu jádra. Nedělá časová razítka. Co byste měli udělat, je nakonfigurovat syslog tak, aby uchopil protokoly jádra z této vyrovnávací paměti a odeslal je do souboru (pokud to již není nastaveno). Poznámka, výchozí konfigurace syslogu CentOS 5.x odesílá protokoly jádra na /var/log/messages
, jak si vzpomínám.
Pokud chcete odeslat všechny protokoly jádra (dmesg) na /var/log/kern.log
, pomocí výchozího démona syslog byste do /etc/syslog.conf
přidali řádek podobný následujícímu
kern.* /var/log/kern.log
Řešení 2:
Existuje řešení "Povolení časových razítek pro dmesg/Kernel Ring Buffer"
Můžete přidat:
printk.time=1
do cmdline jádra.
Pokud jde o mě, přidal jsem do rc.local na všech strojích s loutkou. Je to pro mě jednodušší) :
if test -f /sys/module/printk/parameters/time; then
echo 1 > /sys/module/printk/parameters/time
fi
Řešení 3:
Napsal jsem tento jednoduchý skript. Ano, je to pomalé. Pokud chcete něco rychlejšího, buď ve skutečnosti napíšete skript v perlu, pythonu nebo něčem jiném. Jsem si jistý, že tento jednoduchý skript vám může napovědět, jak jej lze vypočítat.
Vezměte prosím na vědomí, že jsem ignoroval zlomek sekund zaznamenaný v každém řádku (za . v časovém razítku).
#!/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
Doufám, že to pomůže. :)