Gostaria de ler o meu Centos 5.x dmesg com carimbo de data e hora, como faço isso?
dmesg -T
Gostaria de ler o meu Centos 5.x dmesg com carimbo de data e hora, como faço isso?
dmesg -T
Respostas:
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 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
/etc/rsyslog.conf
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
rc.local
é realmente uma solução feia para isso (usar rc.local
quase sempre é uma solução feia para qualquer coisa). Uma solução melhor seria printk.time = 1
inserir /etc/sysctl.conf
ou inserir um arquivo /etc/sysctl.d/
. Essa é a razão pela qual esses arquivos existem. Se enfiar coisas no rc.local
final, você terá uma partida frágil, complicada, bagunçada e pouco confiável.
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. :)
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
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 $_;'
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 $ _.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 $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".