Linux Centos z datownikiem dmesg

15

Chciałbym przeczytać moją Centos 5.x dmesg ze znacznikiem czasu, jak to zrobić?

edotan
źródło
później dmesg obsługuje flagę -T, może spróbuj użyć -T, jeśli twój dmesg ją obsługuje.
ilansch
obsługuje centos 7+dmesg -T
rogerdpack

Odpowiedzi:

12

dmesgodczytuje 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
Christopher Cashell
źródło
4
Dziękuję za Twoją odpowiedź. Dla każdego, kto szuka systemu CentOS 6, znalazłem go/etc/rsyslog.conf
Safado
Tak, z CentOS (i RHEL) 6.x zmienili domyślnego demona syslog ze starego sysklogd na rsyslog. Jest również dostępny jako (obsługiwany) pakiet dla RHEL / CentOS 5.x.
Christopher Cashell
1
Cóż, mam to na mojej liście rzeczy do odkrycia, ale teraz zaoszczędziłeś mi trochę googlingu
Safado
8

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
Alex Bozhenko
źródło
to działa dla mnie
c4f4t0r
5
Używanie rc.localjest naprawdę brzydkim rozwiązaniem ( rc.localprawie zawsze jest brzydkim rozwiązaniem czegokolwiek). Lepszym rozwiązaniem byłoby umieścić printk.time = 1na /etc/sysctl.conflub plik /etc/sysctl.d/. Właśnie dlatego te pliki istnieją. Wbijanie rzeczy w rc.localkońcu sprawi, że zaczniesz od kruchego, zawiłego, niechlujnego i niewiarygodnego start-upu.
Christopher Cashell
To, co komentuje @ChristopherCashell, jest jedyną prawidłową odpowiedzią na to pytanie. Szkoda, że ​​to nie jest rzeczywista odpowiedź.
Petr
1

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

mściciel
źródło
0

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
MDA
źródło
0

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 $_;' 
  • perl -n jest sposobem na odczyt standardowego wejścia i wczytanie do zmiennej $ _.
  • Treść (nie sekcja BEGIN) jest następnie uruchamiana raz dla każdej linii.
  • BEGIN uruchamia kod raz {}.
  • $ a jest początkiem dmesg od epoki (sekundy)
  • Komenda s / ... przyjmuje wartość w $ _ i zastępuje część \ s * #####. ###### znacznika czasu wersją „lokalnego czasu” przesunięcia dmesg (1 $) dodanego do czas uruchomienia systemu ($ a)
  • print $ a drukuje dmesg ze znacznikiem czasu przyjaznym dla regionu, zastępując znacznik czasu „sekund od uruchomienia”.
Luigi Bai
źródło
1
I podobnie jak oryginalna odpowiedź, wymaga wyjaśnienia. Czy możesz edytować swój post, podzielić go i przejrzeć?
Cory Knutson,
-1

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 $ _.
  • Treść (nie sekcja BEGIN) jest następnie uruchamiana raz dla każdej linii.
  • BEGIN uruchamia kod raz {}.
  • $ a jest początkiem dmesg od epoki
  • Polecenie s / ... przyjmuje wartość w $ _ i zastępuje część #####. ###### znacznika czasu wersją „lokalnego czasu” przesunięcia dmesg (1 $) dodanego do startu systemu czas ($ a)
  • print $ a drukuje dmesg ze znacznikiem czasu przyjaznym dla regionu, zastępując znacznik czasu „sekund od uruchomienia”.
Howard.TH
źródło
1
Ta odpowiedź wymaga dodatkowych wyjaśnień.
kasperd
@kasperd Oto, co to znaczy: - perl -n jest sposobem na odczyt standardowego wejścia i wczytanie do zmiennej $ _. Treść (nie sekcja BEGIN) jest następnie uruchamiana raz dla każdej linii. - BEGIN uruchamia kod raz {}. $ a jest początkiem dmesg od epoki - 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 $adrukuje dmesg ze znacznikiem czasu przyjaznym dla regionu zastąpionym znacznikiem czasu „sekund od uruchomienia”.
dadinck