Administración de logs en Linux

Linux utiliza el estándar de syslog para administrar los mensajes de log. Esto permite que programas y aplicaciones generen mensajes que pueden ser capturados, procesados y almacenados por el administrador de logs. Elimina la necesidad de tener que implementar un mecanismo de administración de logs para cada aplicación. También significa que los logs pueden ser configurados y controlados en una locación central.

El estándar de syslog utiliza instalaciones y severidades para categorizar los mensajes. Cada mensaje es etiquetado con un código de instalación y un nivel de severidad. Las múltiples combinaciones de facilidades y severidades pueden ser utilizadas para determinar cómo van a ser manejados los mensajes.

Las facilidades son utilizadas para indicar a qué tipo de programa o de qué parte del sistema provienen los mensajes. Por ejemplo, los mensajes que sean etiquetados con la facilidad kern son originados desde el kernel de Linux. Mensajes que sean etiquetados con la facilidad mail provienen de aplicaciones relacionadas con el manejo de correo.

Cada facilidad tiene un número y una palabra clave asociada a él. La siguiente tabla lista las facilidades de syslog.

Número Palabra Clave Descripción
0 kern kernel messages
1 user user-level messages
2 mail mail system
3 daemon system daemons
4 auth security/authorization messages
5 syslog messages generated by syslogd
6 lpr line printer subsystem
7 news network news subsystem
8 uucp UUCP subsystem
9 clock daemon
10 authpriv security/authorization messages
11 ftp FTP daemon
12 - NTP subsystem
13 - log audit
14 - log alert
15 cron clock daemon
16 local0 local use 0 (local0)
17 local1 local use 1 (local1)
18 local2 local use 2 (local2)
19 local3 local use 3 (local3)
20 local4 local use 4 (local4)
21 local5 local use 5 (local5)
22 local6 local use 6 (local6)
23 local7 local use 7 (local7)

Cannon, Jason. Linux Administration: The Linux Operating System and Command Line Guide for Linux Administrators

La siguiente tabla lista cada una de las severidades, incluyendo su código, palabra clave y descripción:

Code Severity Keyword Description
0 Emergency emerg (panic) System is unusable
1 Alert alert Action must be taken immediately
2 Critical crit Critical conditions
3 Error err (error) Error conditions
4 Warning warning (warn) Warning conditions
5 Notice notice Normal but significant condition
6 Info info Informational messages
7 Debug debug Debug-level messages

Cannon, Jason. Linux Administration: The Linux Operating System and Command Line Guide for Linux Administrators.

Un servidor syslog acepta mensajes syslog y procesa dichos mensajes basándose en una serie de reglas configurables. Tradicionalmente, el daemon syslogd tenía este rol, pero hoy en día muchas distribuciones de Linux vienen con otras alternativas, como lo son rsyslog y syslog-ng. Para efectos de este post me voy a enfocar en rsyslog; sin embargo, los conceptos aplican para cualquier servidor syslog.

Reglas de logs

El archivo de configuración principal para rsyslog es /etc/rsyslog.conf. Puede incluir archivos de configuración adicionales utilizando la directiva $IncludeConfig. Por ejemplo, la siguiente línea hará que rsyslog lea e incluya todos los archivos de configuración que terminen con .conf en el directorio /etc/rsyslog.d/.

$IncludeConfig /etc/rsyslog.d/*.conf

Las reglas de logs consisten en dos campos, el primer campo es llamado el campo selector y lista las facilidades y severidades de los mensajes a incluir en dicha regla. El segundo campo es llamado el campo de acción y determina qué pasará con los mensajes que coincidan con el campo selector. La acción más común es escribir los mensajes a un archivo de log. El campo selector y el campo de acción pueden estar separados por uno o más espacios o tabulaciones.

El formato del campo selector es FACILIDAD.SEVERIDAD. En esta parte es posible utilizar wildcards en caso de ser requeridas. Por ejemplo, puede utilizar el selector mail.* para seleccionar todos los mensajes de mail. También es posible omitir la .SEVERIDAD si desea incluir todos los mensajes de una facilidad, por lo tanto mail.* y mail son equivalentes. Si desea omitir los mensajes de una facilidad puede utilizar FACILIDAD.none. Si desea seleccionar múltiples pares de facilidades/severidades, separe cada una de ellas con un punto y coma.

La siguiente regla de ejemplo coincide con los mensajes que tienen la facilidad mail y cualquier severidad. Escribe todos los mensajes coincidentes en  /var/log/mail.log.

mail.* /var/log/mail.log

Si la ruta comienza con un símbolo negativo, eso le dirá a rsyslog que no se debe realizar una operación sync() para cada mensaje. Esto a veces es llamado modo de caché. Cuando esté utilizando el modo de caché, debe saber que algunos mensajes pueden perderse si el sistema falla inmediatamente después de un intento de escritura. Sin embargo, podrás notar mejoras de rendimiento durante las operaciones normales si tienes un sistema que realice tareas de registros de logs. Las configuraciones que vienen de manera predeterminada en sistemas Linux usualmente tienen una mezcla entre modo de caché (-/ruta) y modo de no caché (/ruta) con los mensajes menos críticos utilizando el modo de caché, como se puede ver en el siguiente ejemplo.

mail.* -/var/log/mail.log

El siguiente ejemplo contiene diferentes acciones para diferentes severidades en los mensajes de correo. Note cómo los mensajes menos críticos están utilizando el modo de caché.

mail.info -/var/log/mail.info
mail.warn -/var/log/mail.warn
mail.err   /var/log/mail.err

Crear tus propios mensajes de syslog

Puedes utilizar el comando logger para generar mensajes de syslog. Esto puede ser útil si deseas probar algunos cambios en la configuración que hayas realizado en el sistema de syslog o si quieres generar mensajes de syslog para tus propios scrips del shell. Utiliza la opción -p para indicar el nivel de FACILIDAD.SEVERIDAD. Si no especificas un par de facilidad/severidad, tomará el predeterminado que es user.notice. También puedes usar la opción -t para poder ponerle un tag o etiqueta a tus mensajes. logger [opciones] mensaje.

En el siguiente ejemplo se genera un mensaje con la facilidad mail y el nivel de severidad info. Podrás notar que el mensaje se encuentra en su archivo de log correspondiente.

logger -p mail.info -t mailtest "Testing 123"
sudo tail -1 /var/log/mail.log
# Output
# Dec 11 08:05:18 linuxsvr mailtest: Testing 123.

Rotación de logs

Puede utilizar la herramienta logrotate para rotar, comprimir, remover e incluso enviar archivos de logs por correo. Esto provee una manera automatizada de administrar los archivos de logs y puede ayudar a prevenir que el espacio de almacenamiento se llene con puros archivos de logs.

El archivo de configuración de logrotate está ubicado en /etc/logrotate.conf. Como muchos otros archivos de configuración puede utilizar una directiva include. Esta línea le dice a logrotate que lea los archivos de configuración que se encuentran en el directorio /etc/logrotate.d/.

include /etc/logrotate.d

El siguiente es un archivo de ejemplo que muestra la configuración de logrotate.

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

Probar la configuración de logrotate

Si hiciste cambios en la configuración de logrotate y deseas probarla puedes utilizar el siguiente comando.

# logrotate -fv /etc/logrotate.conf

El parámetro -f le indica a logrotate que debe forzar la rotación de logs mientras que la opción -v muestra información detallada en pantalla.