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?


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

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

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. :)


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

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".

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".

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.