Linux Centos с меткой времени dmesg

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

6 ответов

Решение

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

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

kern.*                         /var/log/kern.log

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

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

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

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

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

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

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

Небольшой скрипт на 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/... принимает значение в $_ и заменяет часть #####. ###### метки времени на версию локального времени смещения dmesg ( $1), добавленную к запуску системы. время ($ а)
  • print $ a печатает dmesg с меткой времени, дружественной к локали, замененной меткой времени "секунды с момента загрузки".
Другие вопросы по тегам