Linux Centos con marca de tiempo dmesg

15

Me gustaría leer mi dmesg Centos 5.x con marca de tiempo, ¿cómo hago esto?

edotan
fuente
más tarde, dmesg admite el indicador -T, quizás intente usar -T si su dmesg lo admite.
ilansch
Centos 7+ soportadmesg -T
rogerdpack

Respuestas:

12

dmesglee el búfer de anillo de registro de Kernel. No hace marcas de tiempo. Lo que debe hacer es configurar syslog para tomar los registros del núcleo de ese búfer y enviarlos a un archivo (si aún no está configurado para hacerlo). Tenga en cuenta que, por /var/log/messageslo que recuerdo , la configuración predeterminada de syslog de CentOS 5.x envía registros del kernel .

Si desea enviar todos los registros del kernel (dmesg) a /var/log/kern.log, utilizando el demonio syslog predeterminado, agregará una línea como la siguiente a/etc/syslog.conf

kern.*                         /var/log/kern.log
Christopher Cashell
fuente
44
Gracias por la respuesta. Para cualquiera que busque que esté ejecutando CentOS 6, lo encontré en/etc/rsyslog.conf
Safado
Sí, con CentOS (y RHEL) 6.x, cambiaron el demonio syslog predeterminado del viejo sysklogd a rsyslog. También está disponible como paquete (compatible) para RHEL / CentOS 5.x.
Christopher Cashell
1
Bueno, he tenido esto en mi lista de cosas que resolver, pero ahora me has ahorrado un poco en Google
Safado
8

Hay una solución "Habilitar marcas de tiempo para dmesg / Kernel Ring Buffer"

Puedes agregar:

printk.time=1

kernel cmdline.

En cuanto a mí, he agregado a rc.local en todas las máquinas con títeres. Es más fácil para mí):

if test -f /sys/module/printk/parameters/time; then
   echo 1 > /sys/module/printk/parameters/time
fi
Alex Bozhenko
fuente
eso funciona para mí
c4f4t0r
55
Usar rc.locales realmente una solución fea para esto (usar rc.locales casi siempre una solución fea para cualquier cosa). Una mejor solución sería poner o printk.time = 1ingresar /etc/sysctl.confun archivo /etc/sysctl.d/. Esa es la razón por la que existen estos archivos. Al meter cosas rc.local, eventualmente te dejará con una puesta en marcha frágil, enrevesada, desordenada y poco confiable.
Christopher Cashell
Este es el comentario de @ChristopherCashell es la única respuesta correcta a esta pregunta. Es una pena, no es una respuesta real.
Petr
1

He escrito este simple guión. Si, es lento. Si quieres algo más rápido, puedes escribir un script en Perl, Python o algo más. Estoy seguro de que este simple script puede darle la idea de cómo se puede calcular.

Tenga en cuenta que ignoré la fracción de segundos registrada en cada línea (después de. En la marca de tiempo).

#!/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 ayude. :)

vengador
fuente
0

La modificación del script en la línea de caso no comienza con un "["

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

Esta es una actualización de la sugerencia de Plutoid, eliminando los espacios iniciales de la marca de tiempo.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;' 
  • perl -n es una forma de leer la entrada estándar y leer en la variable $ _.
  • El cuerpo (no la sección BEGIN) se ejecuta una vez para cada línea.
  • BEGIN ejecuta el código en {} una vez.
  • $ a es el comienzo de dmesg desde la época (segundos)
  • El comando s / ... toma el valor en $ _ y sustituye la parte \ s * #####. ###### de la marca de tiempo con la versión "localtime" del desplazamiento dmesg ($ 1) agregado a la hora de inicio del sistema ($ a)
  • print $ a imprime el dmesg con la marca de tiempo amigable de la localidad sustituida por la marca de tiempo "segundos desde el arranque".
Luigi Bai
fuente
1
Y como la respuesta original, necesita alguna explicación. ¿Puedes editar tu publicación, desglosarla y recorrerla?
Cory Knutson
-1

Un pequeño script perl como se muestra a continuación. Es una forma general, y no soy el autor.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
  • perl -n es una forma de leer la entrada estándar y leer en la variable $ _.
  • El cuerpo (no la sección BEGIN) se ejecuta una vez para cada línea.
  • BEGIN ejecuta el código en {} una vez.
  • $ a es el comienzo de dmesg desde la época
  • El comando s / ... toma el valor en $ _ y sustituye la parte #####. ###### de la marca de tiempo con la versión "localtime" del desplazamiento dmesg ($ 1) agregado al inicio del sistema tiempo ($ a)
  • print $ a imprime el dmesg con la marca de tiempo amigable de la localidad sustituida por la marca de tiempo "segundos desde el arranque".
Howard.TH
fuente
1
Esta respuesta necesita más explicación.
Kasperd
@kasperd Esto es lo que significa: - perl -n es una forma de leer la entrada estándar y leer en la variable $ _. El cuerpo (no la sección BEGIN) se ejecuta una vez para cada línea. - BEGIN ejecuta el código en {} una vez. $ a es el comienzo de dmesg desde la época: el s/...comando toma el valor en $ _ y sustituye la parte #####. ###### de la marca de tiempo con la versión "localtime" del desplazamiento dmesg ($ 1 ) agregado a la hora de inicio del sistema ($ a). - print $aimprime el dmesg con la marca de tiempo amigable localmente sustituida por la marca de tiempo "segundos desde el arranque".
dadinck