Centos do Linux com registro de data e hora dmesg

15

Gostaria de ler o meu Centos 5.x dmesg com carimbo de data e hora, como faço isso?

Edotan
fonte
depois o dmesg suporta o sinalizador -T, talvez tente usar -T se o seu dmesg o suportar.
ilansch
centos 7+ suportadmesg -T
rogerdpack

Respostas:

12

dmesglê 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 desse buffer e enviá-los para um arquivo (se ainda não estiver definido para isso). Observe que a configuração padrão do syslog do CentOS 5.x envia os logs do kernel para /var/log/messages, se bem me lembro.

Se você deseja 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
Christopher Cashell
fonte
4
Obrigado pela resposta. Para quem procura rodar o CentOS 6, eu encontrei-o em/etc/rsyslog.conf
Safado 30/03
Sim, com o CentOS (e RHEL) 6.x, eles mudaram o daemon syslog padrão do antigo sysklogd para rsyslog. Também está disponível como um pacote (suportado) para o RHEL / CentOS 5.x.
22612 Christopher Christopherell
1
Bem, eu tive isso na minha lista de coisas para descobrir, mas agora você me salvou algum googling
Safado
8

Existe a solução "Ativando carimbos de data / hora para 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
Alex Bozhenko
fonte
que funciona para mim
c4f4t0r
5
Usar rc.localé realmente uma solução feia para isso (usar rc.localquase sempre é uma solução feia para qualquer coisa). Uma solução melhor seria printk.time = 1inserir /etc/sysctl.confou inserir um arquivo /etc/sysctl.d/. Essa é a razão pela qual esses arquivos existem. Se enfiar coisas no rc.localfinal, você terá uma partida frágil, complicada, bagunçada e pouco confiável.
Christopher Cashell
É o que está em comentário de @ChristopherCashell é a única resposta correta para esta pergunta. É uma pena que não seja uma resposta real.
21416 Petr
1

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

Observe que eu ignorei a fração de segundos registrada em cada linha (após o. No registro de data e hora).

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

Espero que ajude. :)

vingador
fonte
0

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

#!/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
MDA
fonte
0

Esta é uma atualização da sugestão de Plutoid, removendo os espaços iniciais do registro de data e hora.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;' 
  • O perl -n é uma maneira de ler a entrada padrão e ler a variável $ _.
  • O corpo (não a seção BEGIN) é executado uma vez para cada linha.
  • BEGIN executa o código em {} uma vez.
  • $ a é o início do dmesg desde a época (segundos)
  • O comando s / ... pega o valor em $ _ e substitui a parte \ s * #####. ###### 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 / hora compatível com a localidade, substituído pelo carimbo de hora "segundos desde a inicialização".
Luigi Bai
fonte
1
E, como a resposta original, precisa de alguma explicação. Você pode editar sua postagem, dividi-la e seguir em frente?
Cory Knutson
-1

Um pequeno script perl como abaixo. É uma maneira 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 a variável $ _.
  • O corpo (não a seção BEGIN) é executado uma vez para cada linha.
  • BEGIN executa o código em {} uma vez.
  • $ a é o início do dmesg desde a época
  • O comando s / ... pega o valor em $ _ e substitui a parte #####. ###### do registro de data e hora pela versão "localtime" do deslocamento dmesg ($ 1) adicionado ao início do sistema tempo ($ a)
  • print $ a imprime o dmesg com o carimbo de data / hora compatível com a localidade, substituído pelo carimbo de hora "segundos desde a inicialização".
Howard.TH
fonte
1
Esta resposta precisa de mais explicações.
kasperd
@kasperd Aqui está o que isso significa: - perl -n é uma maneira de ler a entrada padrão e ler a variável $ _. O corpo (não a seção BEGIN) é executado uma vez para cada linha. - BEGIN executa o código em {} uma vez. $ a é o início do dmesg desde a época - O s/...comando pega o valor em $ _ e substitui a parte #####. ###### do registro de data e hora pela versão "localtime" do deslocamento do dmesg ($ 1 ) adicionado à hora de início do sistema ($ a). - print $aimprime o dmesg com o carimbo de data / hora compatível com a localidade, substituído pelo carimbo de hora "segundos desde a inicialização".
dadinck