Linux Centos com dmesg timestamp

13

Eu gostaria de ler meu dmesg do Centos 5.x com timestamp, como faço isso?

    
por edotan 30.03.2012 / 16:37

6 respostas

11

dmesg lê o buffer do anel de log do Kernel. Não faz timestamps. O que você deve fazer é configurar o syslog para pegar os logs do kernel daquele buffer e enviá-los para um arquivo (se ainda não estiver configurado para isso). Note que a configuração padrão do syslog do CentOS 5.x envia logs do kernel para /var/log/messages , se bem me lembro.

Se você quiser enviar todos os logs do kernel (dmesg) para /var/log/kern.log , usando o daemon syslog padrão, adicione uma linha como a seguinte a /etc/syslog.conf

kern.*                         /var/log/kern.log
    
por 30.03.2012 / 18:53
7

Existe uma solução "Ativando registros de data e hora para o dmesg / Kernel Ring Buffer"

Você pode adicionar:

printk.time=1

para o cmdline do kernel.

Quanto a mim, adicionei ao rc.local em todas as máquinas com fantoches. É mais fácil para mim):

if test -f /sys/module/printk/parameters/time; then
   echo 1 > /sys/module/printk/parameters/time
fi
    
por 28.04.2014 / 19:23
1

Eu escrevi este script simples. Sim, é lento. Se você quiser algo mais rápido, você realmente escreve um script em perl, python ou outra coisa. Tenho certeza de que esse script simples pode lhe mostrar como isso pode ser calculado.

Por favor note que eu ignorei a fração de segundos registrada em cada linha (depois do. no timestamp).

#!/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]\+\).*//g")"
 timestamp=$(( ${timestamp} + ${upmmt} ))
 echo "${line}" | sed "s/^[^]]\+]\(.*\)/$(localtime "${timestamp}") -/g"
done

Espero que ajude. :)

    
por 03.06.2012 / 20:05
0

A modificação de script na linha de caso não começa com "["

#!/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]\+\).*//g")
        timestamp=$(( ${timestamp} + ${upmmt} ))
        echo "${LINE}" | sed "s/^[^]]\+]\(.*\)/$(localtime "${timestamp}") -/g"
    else
        echo "${LINE}"
    fi
done
    
por 21.03.2016 / 13:20
0

Esta é uma atualização sobre a sugestão do Plutoid, removendo os espaços iniciais do timestamp.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;' 
  • perl -n é uma maneira de ler a entrada padrão e ler na variável $ _.
  • O corpo (não a seção BEGIN) é executado uma vez para cada linha.
  • BEGIN executa o código {} uma vez.
  • $ a é o começo do dmesg desde a época (segundos)
  • O comando s / ... recebe o valor em $ _ e substitui a parte \ s * #####. ###### do carimbo de data / hora pela versão "localtime" do deslocamento do dmesg ($ 1 ) adicionado ao horário de início do sistema ($ a)
  • print $ a imprime o dmesg com o carimbo de data e hora amigável localmente substituído pelo carimbo de hora "segundos desde a inicialização".
por 11.07.2017 / 16:57
-1

Um pequeno script em perl como abaixo. É um jeito geral e eu não sou o autor.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
  • perl -n é uma maneira de ler a entrada padrão e ler na variável $ _.
  • O corpo (não a seção BEGIN) é executado uma vez para cada linha.
  • BEGIN executa o código {} uma vez.
  • $ a é o começo do dmesg desde a época
  • O comando s / ... recebe o valor em $ _ e substitui a parte #####. ###### do carimbo de data / hora pela versão "localtime" do deslocamento dmesg ($ 1) adicionado a a hora de início do sistema ($ a)
  • print $ a imprime o dmesg com o carimbo de data e hora amigável local, substituído pelo carimbo de hora "segundos desde a inicialização".
por 18.08.2015 / 07:31