Chciałbym przeczytać moją Centos 5.x dmesg ze znacznikiem czasu, jak to zrobić?
dmesg -T
Chciałbym przeczytać moją Centos 5.x dmesg ze znacznikiem czasu, jak to zrobić?
dmesg -T
Odpowiedzi:
dmesg
odczytuje bufor pierścieniowy dziennika jądra. Nie robi znaczników czasu. To, co powinieneś zrobić, to skonfigurować syslog, aby pobierał dzienniki jądra z tego bufora i wysyłał je do pliku (jeśli nie jest to jeszcze ustawione). Uwaga: domyślna konfiguracja syslog CentOS 5.x wysyła logi jądra do /var/log/messages
, jak pamiętam.
Jeśli chcesz wysłać wszystkie dzienniki jądra (dmesg) /var/log/kern.log
, używając domyślnego demona syslog, dodaj wiersz podobny do następującego/etc/syslog.conf
kern.* /var/log/kern.log
/etc/rsyslog.conf
Istnieje rozwiązanie „Włączanie znaczników czasu dla bufora pierścieniowego dmesg / Kernel”
Możesz dodać:
printk.time=1
do cmdline jądra.
Co do mnie, dodałem do rc.local na wszystkich maszynach z marionetką. To dla mnie łatwiejsze):
if test -f /sys/module/printk/parameters/time; then
echo 1 > /sys/module/printk/parameters/time
fi
rc.local
jest naprawdę brzydkim rozwiązaniem ( rc.local
prawie zawsze jest brzydkim rozwiązaniem czegokolwiek). Lepszym rozwiązaniem byłoby umieścić printk.time = 1
na /etc/sysctl.conf
lub plik /etc/sysctl.d/
. Właśnie dlatego te pliki istnieją. Wbijanie rzeczy w rc.local
końcu sprawi, że zaczniesz od kruchego, zawiłego, niechlujnego i niewiarygodnego start-upu.
Napisałem ten prosty skrypt. Tak, jest wolny. Jeśli chcesz czegoś szybciej, albo piszesz skrypt w Perlu, Pythonie lub czymś innym. Jestem pewien, że ten prosty skrypt może wyjaśnić, jak można go obliczyć.
Uwaga: zignorowałem ułamek sekund zarejestrowany w każdej linii (po znaczniku czasu w.).
#!/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
Mam nadzieję, że to pomoże. :)
Modyfikacja skryptu w przypadku, gdy wiersz sprawy nie zaczyna się od „[”
#!/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
Jest to aktualizacja sugestii Plutoid, usuwająca wiodące spacje ze znacznika czasu.
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;'
Mały skrypt perla, jak poniżej. To ogólny sposób i nie jestem autorem.
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
perl -n
jest sposobem na odczyt standardowego wejścia i wczytanie do zmiennej $ _.s/...
Komenda przyjmuje wartość w $ _ i zastępuje część #####. ###### znacznika czasu wersją „lokalnego czasu” przesunięcia dmesg (1 $ ) dodane do godziny rozpoczęcia systemu ($ a). - print $a
drukuje dmesg ze znacznikiem czasu przyjaznym dla regionu zastąpionym znacznikiem czasu „sekund od uruchomienia”.