Назад | Перейти на главную страницу

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

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

dmesg читает кольцевой буфер журнала ядра. Он не делает отметок времени. Что вам нужно сделать, так это настроить syslog на захват журналов ядра из этого буфера и отправку их в файл (если он еще не настроен для этого). Обратите внимание: конфигурация системного журнала 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

в командную строку ядра.

Что касается меня, я добавил в 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

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

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

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

Это обновление предложения Plutoid, в котором из метки времени удалены начальные пробелы.

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 с меткой времени, совместимой с локалью, замененной меткой времени «секунды с момента загрузки».

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