Відповіді:
dmesg
читає буфер кільця журналу ядра. Це не робить часових позначок. Що потрібно зробити, це налаштувати syslog, щоб схопити журнали ядра з цього буфера та відправити їх у файл (якщо він ще не встановлений для цього). Зверніть увагу, конфігурація syslog CentOS 5.x за замовчуванням надсилає журнали ядра до /var/log/messages
, наскільки я пам'ятаю.
Якщо ви хочете надіслати всі журнали ядра (dmesg) до системи /var/log/kern.log
, використовуючи демона syslog за замовчуванням, ви додасте такий рядок, як наступний/etc/syslog.conf
kern.* /var/log/kern.log
/etc/rsyslog.conf
Є рішення "Увімкнути часові позначки для 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
rc.local
справді неприємного рішення для цього (використання rc.local
майже завжди некрасивого рішення будь-чого). Кращим рішенням буде введення printk.time = 1
в /etc/sysctl.conf
файл або файл /etc/sysctl.d/
. Ось чому ці файли існують. Набивання речей в rc.local
кінцевому підсумку залишить вас крихким, заплутаним, брудним, ненадійним запуском.
Я написав цей простий сценарій. Так, це повільно. Якщо ви хочете чогось швидшого, ви фактично пишете сценарій на 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
Я сподіваюся, що це допомагає. :)
Модифікація сценарію у випадку, коли рядок не починається з "["
#!/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
Це оновлення за пропозицією Плутоїда, видалення провідних пробілів із часової позначки.
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;'
Трохи сценарій Perl, як показано нижче. Це загальний шлях, і я не автор.
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
perl -n
є способом зчитування стандартного вводу та зчитування в змінну $ _.s/...
Команда приймає значення у $ _ і замінює частину #####. ####### часової позначки версією "localtime" зсувом dmesg ($ 1 ) додано до часу початку системи ($ a). - print $a
друкує dmesg з міткою часу, дружньою для локалізації, заміненою на часову позначку "секунди з моменту завантаження".