Вопрос: Linux Centos с dmesg timestamp


Я хотел бы прочитать мой Centos 5.x dmesg с меткой времени, как мне это сделать?


13
2018-03-30 14:37


Источник


позже dmesg поддерживает флаг -T, возможно, попробуйте использовать -T, если ваш dmesg поддерживает его. - ilansch


Ответы:


dmesg читает буфер буфера журнала ядра. Он не выполняет отметки времени. Что вам нужно сделать, так это настроить syslog, чтобы захватить журналы ядра из этого буфера и отправить их в файл (если он еще не установлен для этого). Обратите внимание, что по умолчанию CentOS 5.x syslog config отправляет журналы ядра в /var/log/messages, как я помню.

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

kern.*                         /var/log/kern.log

11
2018-03-30 16:53



Спасибо за ответ. Для тех, кто смотрит на CentOS 6, я нашел его в /etc/rsyslog.conf - Safado
Да, с CentOS (и RHEL) 6.x они изменили демона syslog по умолчанию от старого sysklogd до rsyslog. Он доступен как (поддерживаемый) пакет для RHEL / CentOS 5.x. - Christopher Cashell
Ну, у меня было это в моем списке вещей, чтобы разобраться, но теперь вы спасли мне немного googling - Safado


Существует решение «Включение временных меток для 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

7
2018-04-28 17:23



это подходит для меня - c4f4t0r
С помощью rc.local на самом деле это отвратительное решение для этого (используя rc.local почти всегда является уродливым решением чего-либо). Лучшим решением было бы printk.time = 1 в /etc/sysctl.conf или файл в /etc/sysctl.d/, Вот почему эти файлы существуют. Забивание rc.local в конечном итоге оставит вас с хрупким, запутанным, грязным, ненадежным запуском. - Christopher Cashell
Это то, что комментирует @ChristopherCashell, является единственным правильным ответом на этот вопрос. Жаль, что это не реальный ответ. - Petr


Я написал этот простой скрипт. Да, это медленно. Если вы хотите что-то быстрее, вы либо на самом деле пишете скрипт на 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

Я надеюсь, что это помогает. :)


1
2018-06-03 18:05





Изменение скрипта в строке case не начинается с "["

#!/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
2018-03-21 12:20





Это обновление по предложению Плутоида, удаляющее ведущие пробелы из метки времени.

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» версией смещения dmesg ($ 1), добавленной к время начала системы ($ a)
  • print $ a печатает dmesg с временной меткой времени, замененной меткой времени «секунд с момента загрузки».

0
2017-07-11 14:57



И, как и оригинальный ответ, ему нужно некоторое объяснение. Можете ли вы отредактировать свой пост, сломать его и пройти через него? - Cory Knutson


Небольшой скрипт 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
2017-08-18 05:31



Этот ответ нуждается в дополнительном объяснении. - kasperd
@kasperd Вот что это значит: - perl -n - это способ чтения стандартного ввода и чтения в переменную $ _. Затем тело (а не раздел BEGIN) запускается один раз для каждой строки. - BEGIN запускает код в {} один раз. $ a - начало dmesg с эпохи - The s/... команда принимает значение в $ _ и заменяет часть времени #####. ###### отметки времени с «localtime» версией смещения dmesg ($ 1), добавленной к времени начала системы ($ a). - print $a печатает dmesg с временной меткой времени, замененной меткой времени «секунд с момента загрузки». - dadinck