Linux Centos з часовою міткою dmesg


15

Я хотів би прочитати мій Centos 5.x dmesg із позначкою часу, як це зробити?


пізніше dmesg підтримує прапор -T, можливо, спробуйте використовувати -T, якщо ваш dmesg підтримує його.
ilansch

Відповіді:


12

dmesgчитає буфер кільця журналу ядра. Це не робить часових позначок. Що потрібно зробити, це налаштувати syslog, щоб схопити журнали ядра з цього буфера та відправити їх у файл (якщо він ще не встановлений для цього). Зверніть увагу, конфігурація syslog CentOS 5.x за замовчуванням надсилає журнали ядра до /var/log/messages, наскільки я пам'ятаю.

Якщо ви хочете надіслати всі журнали ядра (dmesg) до системи /var/log/kern.log, використовуючи демона syslog за замовчуванням, ви додасте такий рядок, як наступний/etc/syslog.conf

kern.*                         /var/log/kern.log

4
Дякую за відповідь. Для тих, хто шукає, що працює на CentOS 6, я знайшов це/etc/rsyslog.conf
Сафадо

Так, за допомогою CentOS (і RHEL) 6.x вони змінили демона системного журналу за умовчанням зі старого sysklogd на rsyslog. Він також доступний як (підтримується) пакет для RHEL / CentOS 5.x.
Крістофер Кашелл

1
Ну, у мене це було в моєму списку речей, щоб розібратися, але тепер ти врятував мене
гуляв

8

Є рішення "Увімкнути часові позначки для dmesg / Kernel Ring Buffer"

Ви можете додати:

printk.time=1

до ядра cmdline.

Щодо мене, я додав у rc.local на всіх машинах з ляльковими. Мені простіше):

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

що працює для мене
c4f4t0r

5
Використання rc.localсправді неприємного рішення для цього (використання rc.localмайже завжди некрасивого рішення будь-чого). Кращим рішенням буде введення printk.time = 1в /etc/sysctl.confфайл або файл /etc/sysctl.d/. Ось чому ці файли існують. Набивання речей в rc.localкінцевому підсумку залишить вас крихким, заплутаним, брудним, ненадійним запуском.
Крістофер Кашелл

Це те, що є у коментарі від @ChristopherCashell, є єдиною правильною відповіддю на це питання. Прикро, що це не реальна відповідь.
Петро

1

Я написав цей простий сценарій. Так, це повільно. Якщо ви хочете чогось швидшого, ви фактично пишете сценарій на perl, python або щось інше. Я впевнений, що цей простий сценарій може дати вам зрозуміти, як його можна обчислити.

Зверніть увагу, що я ігнорував секундовий дріб, зареєстрований у кожному рядку (після. У часовій позначці).

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

Я сподіваюся, що це допомагає. :)


0

Модифікація сценарію у випадку, коли рядок не починається з "["

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

Це оновлення за пропозицією Плутоїда, видалення провідних пробілів із часової позначки.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;' 
  • perl -n - це спосіб зчитувати стандартний вхід і читати змінну $ _.
  • Тіло (не розділ BEGIN) потім виконується один раз для кожного рядка.
  • BEGIN запускає код у {} один раз.
  • $ a - початок dmesg з епохи (секунд)
  • Команда s / ... приймає значення у $ _ і замінює частину \ s * #####. ###### частину часової позначки версією "localtime" ("localtime") зміщення dmesg ($ 1), доданої до час запуску системи ($ a)
  • print $ a друкує dmesg з друкованою часовою маркою, заміненою на часову позначку "секунди з моменту завантаження".

1
І як оригінальна відповідь, вона потребує певного пояснення. Чи можете ви редагувати свою публікацію, розбивати її та переходити до неї?
Cory Knutson

-1

Трохи сценарій Perl, як показано нижче. Це загальний шлях, і я не автор.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
  • perl -n є способом зчитування стандартного вводу та зчитування в змінну $ _.
  • Тіло (не розділ BEGIN) потім виконується один раз для кожного рядка.
  • BEGIN запускає код у {} один раз.
  • $ a - початок dmesg з епохи
  • Команда s / ... приймає значення в $ _ і замінює частину #####. ###### частини часової позначки версією "localtime", зміщеною dmesg ($ 1), доданою до запуску системи час ($ a)
  • print $ a друкує dmesg з друкованою часовою маркою, заміненою на часову позначку "секунди з моменту завантаження".

1
Ця відповідь потребує додаткового пояснення.
kasperd

@kasperd Ось що це означає: - perl -n - це спосіб зчитувати стандартний вхід і читати в змінну $ _. Тіло (а не розділ BEGIN) потім виконується один раз для кожного рядка. - BEGIN запускає код в {} один раз. $ a - це початок dmesg з епохи - s/...Команда приймає значення у $ _ і замінює частину #####. ####### часової позначки версією "localtime" зсувом dmesg ($ 1 ) додано до часу початку системи ($ a). - print $aдрукує dmesg з міткою часу, дружньою для локалізації, заміненою на часову позначку "секунди з моменту завантаження".
dadinck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.