Logs en Linux

Publicado por Marcelo Freri el 22/3/2023

También conocidos como archivos de bitácora, los logs son ficheros que registran mensajes del sistema y aplicaciones. Suelen ser de gran utilidad cuando estamos rastreando posibles errores o simplemente monitorizando el funcionamiento de nuestro servidor.

En este artículo vamos a conocer los principales archivos de bitácora de un sistema Debian GNU/Linux 11.

Especificaciones

Los archivos de bitácora son archivos protegidos que sólo deben ser accedidos por usuarios administradores. Por lo tanto los comandos detallados en esta guía deben ser ejecutados por el usuario root, por un usuario con permisos administrativos o mediante la herramienta sudo.

Ubicación

Los archivos log se almacenan dentro de la carpeta /var/log y sus sub-carpetas. Allí se encuentran tanto los logs del sistema como los de algunas aplicaciones.

Algunos de estos archivos tienen formato de texto plano, por lo que pueden ser accedidos directamente, pero otros son de formato binario y necesitan de una utilidad en particular para ser leídos.

Los archivos de bitácora se van rotando automáticamente cada cierto tiempo o cuando alcanzan un tamaño determinado. La rotación implica que se hace una copia del archivo y se comienza a almacenar en un archivo nuevo. Además, se comprimen los archivos antiguos para ahorrar espacio en disco.

Principales Archivos de Bitácora

boot.log

Contiene mensajes generados durante el arranque del sistema operativo. Es un archivo en formato de texto plano.

wtmp

Lista los usuarios que se han autenticado en el sistema. Archivo en formato binario.

lastlog

Último inicio de sesión para cada usuario definido. Archivo de formato binario.

faillog

Contiene los intentos de inicio de sesión fallidos. Muy útil para detectar intentos de hackeo y cuentas atacadas.

journal

Aquí se almacena el grueso de los mensajes del sistema. Es un archivo binario y por tanto necesitamos de una utilidad para acceder a su contenido.

cups

Mensajes del servidor de impresión. Archivo de texto plano.

cron

Bitácora del programador de tareas. Este archivo en formato de texto plano sirve para controlar si las tareas programadas fueron lanzadas.

Acceso a la Información

En los archivos log, no sólo se guardan los mensajes de error, sino todos los mensajes arrojados por los distintos servicios y componentes del sistema operativo. El volumen de información contenida suele ser enorme, por lo que es necesario filtrar la información de alguna manera. También debemos tener en cuenta que los mensajes se guardan en orden cronológico, esto hace que los mensajes más recientes se encuentren al final de los archivos.

Mensajes del Sistema

Para leer los mensajes generados por el sistema, utilizamos la herramienta Journal Control.

1# journalctl -r

El modificador -r es opcional y le indica al programa que muestre los mensajes en orden cronológico inverso, es decir, primero los más recientes.

Salida del comando journalctl
Ejemplo de salida del comando journalctl.

Por defecto, Journal Control muestra la salida paginada, es decir que podemos navegar usando las teclas de desplazamiento, avance de página y retroceso. Para salir de la vista de página, pulsamos la tecla q.

Si no queremos una salida paginada, utilizamos el modificador -e.

1# journalctl -e

Ver los mensajes para un usuario en particular

Supongamos que queremos ver los mensajes que involucran a un usuario en particular.

Primero debemos averiguar el número de identificación del usuario.

1# id nombre_usuario

Supongamos que el uid es 1010, entonces ejecutamos Journal Control con el siguiente parámetro.

1# journalctl _UID=1010

El comando anterior mostrará sólo los mensajes que involucran a nombre_usuario.

Ver los mensajes generados en una fecha dada

Los mensajes mostrados se pueden filtrar para que se muestren sólo los generados en una fecha específica.

1# journalctl --since "2023-03-22 00:00:00"

El comando anterior mostrará los mensajes generados desde el 22 de marzo hasta hoy.

Para pedir sólo los mensajes del día de hoy, usamos la siguiente orden.

1# journalcl --since today

Para ver los mensajes dentro de un rango de fechas se usan –since y –until.

1# journalctl --since yesterday --until today

La orden anterior mostrará los mensajes de ayer y hoy.

Ver mensajes a medida que se generan

Muchas veces necesitamos monitorizar los mensajes del sistema en tiempo real, por ejemplo cuando sospechamos que una aplicación no funciona correctamente y queremos ver los mensajes que arroja mientras se ejecuta. Esto se logra usando el modificador -f (follow).

1# journalctl -f

Para abandonar la vista en tiempo real, pulsamos la tecla q.

Ver los mensajes para un servicio

También podemos solicitar los mensajes referidos a un servicio en particular.

1# journalctl -u docker

En este ejemplo, nos mostrará los mensajes relativos a Docker.

Mensajes de Inicio del Sistema Operativo

Para acceder a los mensajes almacenados en el archivo de bitácora boot.log utilizamos la herramienta dmesg.

1# dmesg

Salida del comando dmesg con error
Ejemplo de una salida de dmesg mostrando un error de segmentación.

La primer columna indica los segundos transcurridos desde que comenzó a iniciarse el sistema operativo. Se puede cambiar a fecha y hora mediante el modificador -T.

1# dmesg -T

También es posible consultar los mensajes de inicio mediante Journal Control.

1# journalctl -b

Este comando muestra la totalidad de los mensajes de inicio de todas las veces que se inició el sistema operativo que tenga registradas. Se puede indicar el número de inicio del sistema y nos mostrará los datos generados durante esa oportunidad en particular.

Si queremos ver sólo los datos del primer inicio registrado, lo indicamos de la siguiente manera.

1# journalctl -b 1

De esta manera sólo mostrará los datos del primer inicio del sistema. Si queremos ver los datos del segundo inicio, cambiamos el 1 por un 2 y así consecutivamente. Si queremos contar desde el final, usamos números negativos. Para ver los mensajes generados durante la penúltima carga del sistema operativo, ejecutamos lo siguiente.

1# journalctl -b -1

Para ver los mensajes del último inicio, simplemente solicitamos los registros del inicio número cero.

1# journalctl -b 0

Información de Inicios de Sesión

Para ver los últimos inicios de sesión, usamos el comando last.

1# last

Salida del comando last
Ejemplo de salida del comando last.

El comando anterior lista los últimos inicios de sesión, sin importar el usuario, por lo que el usuario que más utiliza el PC será quien aparecerá más veces. Si queremos conocer el último inicio de sesión para cada uno de los usuarios del sistema, usamos lastlog, el cual nos mostrará una entrada por cada usuario definido.

1# lastlog

Bitácoras en Texto Plano

Para los archivos log en formato de texto plano nos valdremos de las herramientas para trabajar con texto que ya se incluyen en Linux.

Para listar el contenido completo de un archivo log:

1# cat /etc/var/cups/access_log

Para ver las primeras 10 líneas del archivo:

1# head /etc/var/cups/access_log

Para ver las últimas 30 líneas de un archivo:

1# tail -30 /etc/var/cups/access_log

También podemos monitorizar en tiempo real los mensajes que se van generando mientras utilizamos una aplicación, de manera similar a como lo hacíamos más arriba con Journal Control.

1# tail -f /etc/log/cups/access_log

Para abandonar la vista en tiempo real, pulsamos CTRL+C.

Configuración de la Bitácora

Vamos a ver cómo configurar las diferentes opciones de registro de mensajes en SystemD.

El archivo principal y que contiene las opciones por defecto es /etc/systemd/journald.conf.

Es recomendado no modificar este archivo, sino hacerlo mediante un archivo de configuración personalizada, dentro del subdirectorio /etc/systemd/journald.conf.d/. El archivo puede llevar cualquier nombre pero debe tener extensión .conf.

Algunos de los parámetros más importantes son los siguientes.

MaxFileSec: Máximo tiempo para almacenar los mensajes en un log, antes de comenzar uno nuevo. Ejemplo: 1week inicia un archivo de log nuevo cada semana.

MaxRetentionSec: Tiempo máximo para almacenar los mensajes.

SystemMaxFileSize: Tamaño máximo que puede alcanzar el archivo log antes de ser rotado. Ejemplo: 1G hará que el archivo sea rotado al alcanzar un gigabyte de tamaño en disco.

Compress: Indica si los archivos de log antiguos se comprimen. Ejemplo: yes para que sean comprimidos.

MaxLevelStore: Nivel máximo de severidad de los mensajes a almacenar.

Esta última opción admite tanto el valor numérico como el nombre del nivel habilitado. En la siguiente tabla se indican los niveles aceptados.

| Nivel | Nombre | Descripción | |-:-|—|—| | 0 | emerg | Antes llamado ‘pánico’. Sistema inusable. ¡Corran por sus vidas! | | 1 | alert | Debe ser corregido inmediatamente. | | 2 | crit | Condición crítica. | | 3 | err | Ocurrió un error grave en la ejecución de un programa. | | 4 | warning | Una condición anormal pero que permite seguir ejecutando el programa. | | 5 | notice | No es un problema en este momento, pero debería ser revisado. | | 6 | info | Información sobre la ejecución de algún proceso. No implica problemas. | | 7 | debug | Mensajes de depuración para los programadores. Ignorar. |

Tengamos en cuenta que si, por ejemplo, habilitamos el nivel 4, los niveles del 0 al 3 también serán habilitados.

Para filtrar mensajes por severidad, usar journalctl -p indicando el número de nivel.

Conclusión

Linux utiliza un sistema de bitácoras para registrar los mensajes generados, tanto por el kernel como por los servicios y aplicaciones en uso. En estos archivos se puede almacenar desde errores de emergencia hasta mensajes de depuración.

Consultar los archivos de log mediante herramientas y filtros permite monitorizar el correcto funcionamiento del sistema y detectar errores, incluso en tiempo real.

En esta guía repasamos el funcionamiento de la bitácora de Debian GNU/Linux 11 y los métodos para acceder a la información contenida.

Vínculos de Interés