[TIP] Como pasar/convertir del timestamping del syslog (dmesg) a hora human readable en Linux

 

Lo tiro acá para toda la posteridad. Un pequeñísimo script para convertir el timestamping de syslog (la cantidad de segundos transcurridos desde que booteó el sistema) a hora local, cosa que a priori parece trivial pero que a la tercera vez que tenés que usar ya te cansa la cabeza.

 

Un poco de bash scripting. Convertir de Unix timestamping en el syslog de Linux a Hora en formato human readable.

 

Este script no es mío, lo robé de algún lado hace años y desde entonces me acompaña a todas partes:

#!/bin/bash

if [ "$#" != "1" ] ; then
echo "Usage: `basename $0` time-offset-integer"
exit 1
elif [ "`echo $1 | sed 's/[0-9]//g'`" != "" ] ; then
echo "Usage: `basename $0` time-offset-integer"
exit 1
fi

N=`date +'%s'`
U=`FS="." /usr/bin/awk '{print $1;}' < /proc/uptime | sed 's/[^0-9].*//'`
TS=`expr $N - $U + $1`
T=`date --date="@$TS"`

echo "$1 seconds after boot was about $T."

 

Como se usa.

A la típica salida del comando dmesg, o /var/log/syslog por ejemplo:

[511684.749771] Process accounting resumed
[511684.842941] systemd[1]: apt-daily-upgrade.timer: Adding 33min 25.167508s random time.
You have new mail in /var/mail/root

 

 

Ejecutás el script anterior, que en este caso llamé syslogtohuman.sh:

~# ./syslogtohuman.sh 511684
511684 seconds after boot was about Thu Aug 16 11:20:13 -03 2018.

 

Y así sabés que esa entrada en el syslog en particular aproximadamente en esa fecha y a esa hora: Thu Aug 16 11:20:13 -03 2018

 

De nada.

[Micro Tip] Loguear texto arbitrario a Syslog en Linux

Esto viene mas que bien si ya estás aplicando el método que explico en este artículo anterior para centralizar todos los Logs que generan Linux, Windows y otros dispositivos que pudieras tener pululando en tu red en un solo host, para poder después leerlos cómodamente desde una página web.

Para que veas todo el mundo que te rodea en modo texto, de preferencia verde sobre fondo negro

Se puede loguear texto arbitrario a syslog desde cualquier PC corriendo Linux en la red simplemente por medio del comando «logger» (sin las comillas).

La salida de logger va a parar derechito a syslog y es accesible desde /var/log/messages:

~ # logger puto el que lee
~ # tail /var/log/messages

Nov 10 23:30:01 dvr cron[12109]: (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons )
Nov 10 23:40:01 dvr cron[12161]: (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons )
Nov 10 23:46:25 dvr root: puto el que lee

Hasta ahí nada de otro mundo, un comando que por si solo no tiene mucha magia, manda texto al syslog, ¿Y?

Por si solo no resalta en absoluto pero: ¿Qué pasa cuando necesitás loguear a syslog la salida de un comando cualquiera que por defecto va a la pantalla y no a syslog?

¡Bingo! Usando un pipe es cuestión de redireccionar la salida a logger para tenerlo accesible desde /var/log/messages, desde la red en el syslog server y desde la página web para mayor comodidad. Supongamos que quiero loguear la salida de ping a uno de los DNS de google:

~ # ping 8.8.8.8 -c2 | logger
~ # tail /var/log/messages

Nov 10 23:40:01 dvr cron[12161]: (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons )
Nov 10 23:46:25 dvr root: puto el que lee
Nov 10 23:50:01 dvr cron[12220]: (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons )
Nov 10 23:56:17 dvr logger: PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
Nov 10 23:56:17 dvr logger: 64 bytes from 8.8.8.8: icmp_req=1 ttl=47 time=178 ms
Nov 10 23:56:18 dvr logger: 64 bytes from 8.8.8.8: icmp_req=2 ttl=47 time=178 ms
Nov 10 23:56:18 dvr logger:
Nov 10 23:56:18 dvr logger: --- 8.8.8.8 ping statistics ---

Nov 10 23:56:18 dvr logger: 2 packets transmitted, 2 received, 0% packet loss, time 1001ms

Nov 10 23:56:18 dvr logger: rtt min/avg/max/mdev = 178.639/178.658/178.677/0.019 ms

Te cambia la vida, ¿No?

A ver cuantos miles de usos le encontrás a esto.

Hoy en un día glorioso…

O de como me conformo con poco.

Hoy llegó el primer visitante desde un buscador a esta, la dirección nueva del Blog.

La frase que lo trajo hasta acá fué:

empresas que usan el syslog

Mientras tanto en la dirección vieja el Top-Five de búsquedas desde las que recibo tráfico reza:

  1. sabu
  2. malditonerd
  3. compaq f500
  4. syslog-ng remoto
  5. compaq presario f500

Claramente, voy a tener que escribir un poco mas sobre syslog en general, parece ser que no está muy trillado el tema.

[HowTo] Controlar los logs generados por syslog desde una página web

Viene de la parte 1: [HowTo] Recibir logs remotos usando Syslog

Usando phpsyslogng se pueden controlar los logs de cualquier PC que corra Linux y Syslog-NG de forma mucho mas visual e intuitiva.

Phpsyslogng provee  además de interesantes gráficos estadísticos y un potente sistema de filtrado por host, aplicación, prioridad y facility.

Para que todo esto funcione es necesario contar con una instalación preexistente de Apache con PHP y MySQL. No voy a entrar en detalles acerca de la instalación y configuración de cada uno de estos servicios por que está fuera del alcance de esta guía.

Instalación:

Usando el gestor de paquetes de su distribución preferida, instalar phpsyslogng. En Gentoo:

echo «app-admin/phpsyslogng mysql» >> /etc/portage/package.use

emerge  phpsyslogng

Opcional, si el servidor Apache está configurado para usar hosts virtuales, se puede instalar solo en uno de estos vhost habilitando la use flag correspondiente.

Una vez instalado, crear la base de datos correspondiente:

mysql> create database syslog;

Query OK, 1 row affected (0.18 sec)

El nombre de la base de datos (syslog) es arbitrario, pero es el que se sugiere por defecto durante la instalación.

Configuración de phpsyslogng:

Para que se rellene la base de datos con las tablas correspondientes basta con apuntar el browser a http://host.dominio.com/phpsyslogng, esto iniciará el asistente para finalizar la configuración en donde se solicitarán el nombre de usuario y contraseña de acceso, parámetros de la base de datos, etc.

Configurando Syslog-NG:

El paso siguiente es configurar Syslog-NG para que pueda convertir los logs a un formato que permita su inserción en la base de datos MySQL, para lo cual basta con editar /etc/syslog-ng/syslog-ng.conf y agregar lo siguiente:

destination d_mysql {
pipe(«/var/log/mysql.pipe»
template(«INSERT INTO logs
(host, facility, priority, level, tag, datetime, program, msg)
VALUES ( ‘$HOST’, ‘$FACILITY’, ‘$PRIORITY’, ‘$LEVEL’, ‘$TAG’, ‘$YEAR-$MON$
‘$PROGRAM’, ‘$MSG’ );\n») template-escape(yes));
};

log {
source(src);
destination(d_mysql);
};

Como ven, todos los logs se envían al archivo /var/log/mysql.pipe que será el encargado de parsearlos y insertarlos en la base de datos, por lo cual, el próximo paso es generar este archivo.

Creando el pipe /var/log/mysql.pipe

Crear un archivo nuevo de nombre arbitrario y con permisos de ejecución:

touch /usr/bin/syslogasql.sh

chmod +x  /usr/bin/syslogasql.sh

Dentro de ese archivo copiar las siguientes líneas:

if [ ! -e /var/log/mysql.pipe ]
then
mkfifo /var/log/mysql.pipe
fi
while [ -e /var/log/mysql.pipe ]
do
mysql -u aqui_tu_usuario –password=aqui_tu_password syslog < /var/log/mysql.pipe >/dev/null
done

Este archivo ejecutable será el encargado de crear el archivo de tubería que rellene la base de datos con la información obtenida desde los logs del sistema. Tiene que estar en constante ejecución por lo que es conveniente que se ejecute al inicio del sistema. En Gentoo esto se logra agregando el nombre del archivo a /etc/conf.d/local.start:

echo «/usr/bin/syslogasql.sh» >> /etc/conf.d/local.start

Es importante que este archivo no se ejecute antes de que se haya iniciado el servidor MySQL.

¡Y eso es todo!

Mientras syslogasql.sh se mantenga en ejecución, toda la salida de syslog será cargada en la base de datos y podrá ser consultada desde phpsyslogng.

Una vez terminada la instalación, un poco de seguridad:

Borrar el directorio de instalación:

rm -fr /var/www/localhost/htdocs/phpsyslogng/install

Evitar accesos ilegítimos a directorios comprometedores agregando las siguientes directivas al archivo de configuración de Apache:

<Directory «/var/www/phpsyslogng/scripts»>
Deny from all
</Directory>
<Directory «/var/www/phpsyslogng/includes»>
Deny from all
</Directory>
<Directory «/var/www/phpsyslogng/config»>
Deny from all
</Directory>