Gestión de archivos de registro del sistema

Linux mantiene archivos donde se registran diversos detalles sobre el funcionamiento del sistema. Tradicionalmente el encargado de registro del sistema ha sido syslogd sin embargo este ha sido desplazado por otras opciones más avanzadas tales como syslog-ng y rsyslogd. Todas las herramientas de registro vienen con un archivo de configuración básico para registrar los eventos más importantes del sistemas. En este tutorial usted aprenderá a cambiar la configuración de la herramienta de registro así como interpretar los archivos de registro.

Tabla de contenidos


Herramientas de registro
Tradicionalmente el encargado del registro del sistema ha sido syslogd para gestionar los mensajes de servidores y programas en modo usuario, y klogd para gestionar el registro de los mensajes del kernel. Tanto syslogd como klogd se incluían en el paquete sysklogd. Sin embargo han sido sustituidos por otras opciones más versátiles como metalog, syslog-ng y rsyslogd. Siendo syslog-ng y rsyslog las opciones más interesantes.

No se va a discutir sobre que opción es mejor, sin embargo rsyslog es la opción por defecto más extendida, incluyendo distribuciones tales como CentOS, Debian, Fedora, Red Hat o Ubuntu. Por ello nos centraremos en rsyslog, sin embargo todas las opciones son muy parecidas en su configuración especialmente en cuanto a las definiciones de opciones de registro que heredan la estructura servicio.prioridad acción del sistema de registro syslogd. El caso de syslog-ng es un poco especial ya que las opciones de registro siguen un formato, que aunque recuerdan a syslogd, es diferente.


El archivo de configuración de rsyslog
El archivo de configuración de rsyslog se localiza en /etc/rsyslog.conf, y adicionalmente podrá encontrar definiciones de opciones de registro en /etc/rsyslog.d/.

La estructura básica del archivo se reduce en comentarios, demarcados con el símbolo de la almohadilla (#), directivas especificas, demarcadas con el símbolo del dolar ($), y las líneas de opciones de registro que son aquellas que no comienzan por # ni $.

A continuación expondremos el archivo de configuración de rsyslog y comentaremos las directivas específicas más comunes.
agd-desktop # nano /etc/rsyslog.conf
# rsyslog v5: load input modules
# If you do not load inputs, nothing happens!
# You may need to set the module load path if modules are not found.

$ModLoad immark.so # provides --MARK-- message capability
$ModLoad imuxsock.so # provides support for local system logging (e.g. via logger command)
$ModLoad imklog.so # kernel logging (formerly provided by rklogd)

# Include configuration files from directory
$IncludeConfig /etc/rsyslog.d/*

# Check config syntax on startup and abort if unclean (default off)
#$AbortOnUncleanConfig on

# Reduce repeating messages (default off)
#$RepeatedMsgReduction on

  • Líneas 5, 6 y 7: directiva de carga de módulos ($ModLoad nombre-modulo). Por defecto se cargan los módulos de marcado de mensajes, de registro de mensajes a través de sockets y de registro de mensajes del kernel. Existen muchos otros módulos, si desea conocer más consulte la lista de módulos de rsyslog.
  • Línea 10: directiva que indica donde se encuentran los archivos de configuración con las opciones de registro.
  • Línea 13: esta directiva hace que rsyslog revise los archivos de configuración y en caso de detectar errores aborte el registro de mensajes.
  • Línea 16: directiva para evitar el registro de mensajes repetitivos.

Otras directivas de rsyslog, aquí no mostradas, pero muy interesantes son aquellas que permiten definir los permisos, propietario y grupo de los archivos y directorios creados. Estas directivas son:
  • $umask 0000
  • $DirCreateMode 0640
  • $FileCreateMode 0640
  • $FileOwner rsyslog
  • $FileGroup rsyslog
  • $DirOwner rsyslog
  • $DirGroup rsyslog

Si desea saber más puede consultar la lista de directivas de rsyslog.

Definir las opciones de registro
La definición de las opciones de registro sigue el formato definido por syslogd servicio.prioridad acción. Donde el servicio es el código del programa que generó el mensaje a registrar, la prioridad es el nivel de importancia del mensaje y la acción es el archivo, servidor de registro remoto, terminal o ubicación donde quedará registrado el mensaje del evento.

Servicios
  • auth mensajes de seguridad y autorizaciones.
  • authpriv mensajes de seguridad y autorizaciones (Privado).
  • cron demonios periódicos tales como cron, anacron, at...
  • daemon otros demonios del sistema.
  • ftp mensajes del subsistema ftp.
  • kern mensajes del núcleo.
  • lpr mensajes del subsistema de impresión.
  • mail mensajes del subsistema de correo.
  • mark mensajes internos del subsistema de registro.
  • news mensajes del susbsistema de noticias.
  • security idéntico a auth. security está en desuso.
  • syslog mensajes del demonio de registro.
  • user mensajes de aplicaciones de usuario.
  • uucp mensajes del subsistema uucp.
  • local0... local7 reservados para uso local.

Puede especificar varios servicios en una misma línea separando-los mediante comas (,). Además puede hacer referencia a todos lo servicios usando el asterisco (*).

Prioridad
Los niveles de prioridad están ordenados en orden ascendente de importancia. Así el primer nivel, debug, tiene un nivel de importancia mínimo mientras que el último nivel, emerg, registra los mensajes de mayor importancia.
  • none deshabilita el reporte.
  • debug mensajes de salida de depuración. Registra los problemas de menor importancia.
  • info mensajes de tipo informativo.
  • notice mensajes de llamada de atención.
  • warning mensajes de aviso.
  • warn sinónimo de warning. warn está en desuso.
  • err mensajes de error.
  • error sinónimo de err. error está en desuso.
  • crit mensajes de error crítico, como fallos de hardware...
  • alert mensajes de alerta, se requiere acción inmediata.
  • emerg mensajes de sistema inestable. Registra los problemas de mayor importancia.
  • panic sinónimo de emerg. panic está en desuso.

Debe tener en cuenta de que el sistema registrará todos los mensajes con un código de prioridad igual o superior al indicado. Es decir, si usted especifica como nivel de prioridad err, el sistema registrada todos los mensajes con una prioridad equivalente a err, crit, alert y emerg.
Note que los servicios se separan con comas (,) y las prioridades con punto y coma (;).
Si desea registrar un nivel de prioridad concreto, puede hacer uso del signo de igualdad (=), como por ejemplo =err. Además puede hacer uso del signo de admiración (!) para negar un nivel, así por ejemplo el nivel de prioridad !err registrará todos los mensajes con un nivel crit, alert y emerg.. El asterisco (*) indica todos los niveles de prioridad.

Recuerde que puede especificar varias prioridades en una misma línea separando-las mediante punto y coma (;).

Acción
La acción más habitual es registrar el evento en un archivo, normalmente situado en /var/log. En /var/log, en función de su distribución, encontrará diversos archivos de registro. Sin embargo en todas las distribuciones encontrará al menos el archivo /var/log/messages. Además de archivar localmente los mensajes,  la mayoría de herramientas de registro permiten:
  • /dev/console o /dev/ttyX Imprime los mensajes en todos los terminales (/dev/console) o en la consola indicada, por ejemplo /dev/tty12 imprime los mensajes en la consola virtual correspondiente a ALT+F12.
  • @servidor:puerto Envía los mensajes al servidor:puerto indicado. El servidor debe estar configurado para recibir los mensajes de registro.
  • user1, user2 Envía los mensajes a los usuarios user1 y user2 en caso de que estén conectado.
  • * Envía los mensajes a todos los usuarios conectados.

Además puede hacer uso del signo menos (-) para indicar que tras registrar un suceso, este no se escriba inmediatamente en el disco duro, quedando por tanto el mensaje en el buffer a la espera de ser escrito en el archivo de registro. Esta opción es interesante si cree que se van a generar muchos mensajes no críticos.

A continuación expondremos las opciones de registro que trae por defecto la herramienta de registro rsyslog, y posteriormente se comentarán:
agd-desktop # nano /etc/rsyslog.conf
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                -/var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog

# Log cron stuff
cron.*                                                  -/var/log/cron

# Everybody gets emergency messages
*.emerg                                                 *

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          -/var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
  • Línea 20: se encuentra comentada, y por tanto la opción de registro esta desactivada. Si activa esa opción, cualquier mensaje del kernel (servicio kern) independientemente de su prioridad (*) se mostrará en todas las consolas (/dev/console).
  • Línea 24: Se han definido varias prioridades de registro, que serán guardada en el buffer temporalmente antes de ser escritas en /var/log/messages. Se registrarán los mensajes de cualquier servicio (*) con un nivel de prioridad igual o superior a info (nivel más bajo exceptuando al nivel de depuración debug) menos los mensajes generados por los servicios mail, authpriv y cron.
  • Línea 27: Se registrarán todos los mensajes de seguridad y autorizaciones privados, independientemente de la prioridad (*), en el fichero /var/log/secure. Además los mensajes serán escritos inmediatamente al disco.
  • Línea 30 y 33: Se registrarán todos los mensajes del subsistema de correo (mail) y tareas programadas (cron) independientemente de su prioridad en los archivos /var/log/maillog y /var/log/cron respectivamente. En este caso, su escritura a disco no será inmediata.
  • Línea 36: Los mensajes de máximo nivel de prioridad (emerg), independientemente del servicio que lo emita, serán enviados a todos a todas las consolas de los usuarios logados en el sistema.
  • Línea 39: Se han definido varios servicios para una misma prioridad. Los mensajes provenientes de uucp y news, con prioridad igual o superior a crit, serán guardados temporalmente en el buffer hasta su escritura en disco en el archivo /var/log/spooler.
  • Línea 42: Guarda todo los mensajes generados durante el inicio del sistema en /var/log/boot.log

Registrar mensajes a través de logger
En determinadas circunstancias puede que desee crear entradas de registros de sucesos del sistemas; ya sea de forma manual o en un script que lleve a cabo tareas de mantenimiento. Para esta taréa puede hacer uso de logger el cual tiene la siguiente sintaxis: logger [opciones] mensaje. Las opciones de logger son:
  • -i Indica a logger que registre su PID (ID de proceso)
  • -s Además de enviar el mensaje a la herramienta de registro, envía la salida al error estándar. Le será útil en scripts interactivos.
  • -d Indica a loger que use datagramas en lugar de una conexión stream al socket del registrador del sistema. Si no sabe lo que esta haciendo, no use esta opción.
  • -f Direcciona el contenido de un archivo al registrador del sistema.
  • -p prioridad Le permite especificar la prioridad del mensaje a enviar al registrador del sistema.
  • -t etiqueta Le permite indicar una etiqueta para el mensaje a enviar al registrador del sistemas
  • -u socket Por defecto logger envía el mensaje al registrador del sistema, si usted quiere alterar este comportamiento y registrar directamente en un socket puede indicarlo con esta opción.

A continuación mostraremos un ejemplo del uso de logger:
agd-desktop # logger -p emerg Registrar un mensaje via logger
agd-desktop # 
Message from syslogd@agd-desktop at May 10 10:16:56 ...
agd: Registrar un mensaje via logger

agd-desktop # tail -n 1 /var/log/messages
2011-05-10T10:16:56.544761+02:00 agd-desktop agd: Registrar un mensaje via logger

Rotar los archivos de registro
Si los archivos de registro no se controlan pueden llegar crecer en exceso, incluso hasta agotar el espacio de la partición. Para evitar estos problemas se usan herramientas de rotación, las cuales renombran y comprimen los archivos de registro, borran los antiguos y obligan al registrador del sistema a usar nuevos archivos. La herramienta más común para esta tarea se denomina logrotate, el cual es invocado a través de una tarea cron.

El archivo de configuración se localiza en /etc/logrotate.conf, y normalmente hace referencia a los archivos de definiciones alojados en /etc/logrotate.d/. Algunos programas que registran datos, especialmente los servidores, hacen uso del demonio de registro del sistema; en otros casos mantienen su propio registro y hacen uso de la utilidad de rotación de registros del sistema. En estos casos los programas suelen incorporar un archivo de configuración que es copiado a /etc/logrotate.d/ para controlar el tamaño de los archivos de registro. A Continuación mostraremos las opciones básicas del archivo de configuración de logrotate:
agd-desktop # /etc/logrotate.conf
# $Header: /var/cvsroot/gentoo-x86/app-admin/logrotate/files/logrotate.conf,v 1.3
#
# Logrotate default configuration file for Gentoo Linux
#

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
compress

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

notifempty
nomail
noolddir

# no packages own lastlog or wtmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.

El archivo de configuración de logrotate se estructura en comentarios, demarcados con el símbolo de la almohadilla (#), definiciones genéricas y definiciones de registro específico, demarcados por la ruta hasta el archivo de registro y encerrado entre llaves ({ }) las definiciones para ese registro específico. Algunas de las definiciones posibles son:
  • dateext El archivo de registro rotado se demarcará con la fecha en lugar de con un número. [+/-] Ver ejemplo
  • compress Indica a logrotate que comprima el archivo de registro tras ser rotado. Por defecto logrotate emplea gzip, sin embargo puede cambiar la herramienta de compresión empleando compresscmd programa, así por ejemplo si desea usar bzip2 debería indicar compresscmd bzip2. Además puede pasar opciones a la herramienta de compresión con compressoptions opciones.
  • create Indica a logrotate que cree un nuevo archivo de registro tras la rotación. Esta opción puede recibir parámetros adicionales para indicar los permisos, el propietario y el grupo del fichero, como por ejemplo create 0664 root root.
  • daily, weekly y monthly Indican la frecuencia de rotación de los archivos de registro.
  • size Define el tamaño máximo de un archivo de registro. Al alcanzar el tamaño máximo el archivo será rotado. Puede indicar el tamaño en bytes o en kilobytes (K) o megabytes (M), así por ejemplo size 100k hará que logrotate rote el archivo de registro una vez alcanzado los 100 KB.
  • rotate x Indica cuantas rotaciones deben ser conservadas. Así por ejemplo rotate 4 conservará 4 archivos de registros antiguos (rotados) además del archivo en uso.
  • mail dirección Indicará a logrotate que envié los archivos de registro antiguos a la dirección indicada cuando roten para desaparecer.
  • prerotate y postrotate Inician líneas de script a ejecutar antes o después de la rotación. El final del script a ejecutar se define con la palabra endscript. Estos comandos se suelen utilizar para indicar a la herramienta de registro que empiece a utilizar un nuevo archivo de registro. [+/-] Ver ejemplo

Interpretar los archivos de registro
La finalidad de los archivos de registro es servir como medio para identificar funcionamientos anómalos o problemas en el sistema. Por ello es importante saber interpretar y trabajar con los archivos de registro del sistema.

El formato de los mensajes de registro es muy similar, independientemente del demonio que emplee para registrar-los. Sin embargo recuerde que en este caso se trabaja con rsyslog por lo que pueden aparecer ligeras discrepancias con otras herramientas de registro.

En el caso de rsyslog, el formato por defecto de los mensajes de registro es: FechaHora hostname programa[PID] mensaje. A continuación mostraremos algunos ejemplos:
2011-05-10T16:03:09.631711+02:00 agd-desktop kernel: [394083.122379] chrome[10865]: segfault at 0 ip 00007fc11ecbcc84 sp 00007fffe5520d70 error 4 in libflashplayer.so[7fc11e93f000+9be000]
2011-05-10T21:53:22.925831+02:00 agd-desktop gnome-session[30498]: WARNING: GSIdleMonitor: Unable to initialize Sync extension
2011-05-10T21:53:23.040807+02:00 agd-desktop gnome-keyring-daemon[30489]: GLib-GIO: Using the 'memory' GSettings backend.  Your settings will not be saved or shared with other applications.
2011-05-10T23:09:25.341043+02:00 agd-desktop su[31506]: pam_unix(su:auth): authentication failure; logname=agd uid=1000 euid=0 tty=/dev/pts/3 ruser=agd rhost=  user=root
2011-05-10T23:09:28.045834+02:00 agd-desktop su[31506]: pam_authenticate: Authentication failure
2011-05-10T23:09:28.046433+02:00 agd-desktop su[31506]: FAILED su for root by agd
2011-05-10T23:09:28.046521+02:00 agd-desktop su[31506]: - /dev/pts/3 agd:root
  • Línea 1: Se trata de un error de segmentación (violación de acceso) como queda patente en el comienzo del mensaje (detrás del nombre de host: agd-desktop) con kernel: [394083.122379]. El mensaje ha sido registrado por el programa chrome con PID 10865 y el error que ha enviado es: segfault at 0 ip 00007fc11ecbcc84 sp 00007fffe5520d70 error 4 in libflashplayer.so[7fc11e93f000+9be000] del cual se puede deducir que se debe a un problema con la biblioteca compartida de flash.
  • Línea 2: El error ha sido enviado por gnome-session, con PID 30498. El mensaje de error indica que no ha sido posible inicializar la extensión de sincronización.
  • Línea 3: El mensaje ha sido enviado por gnome-keyring-daemon con PID 30489.
  • Líneas 4, 5, 6 y 7: El mensaje ha sido enviado por su con PID 31506, e indica un fallo en la validación del usuario agd (ruser=agd), desde el propio host (rhost=), hacia el usuario root (user=root). Además se nos informa de que el intento fallido de acceso se produjo a través del terminal virtual número 3 (/dev/pts/3).

Para trabajar con los archivos de registro deberá usar herramientas que permitan filtrar por palabras claves, como por ejemplo grep, o de herramientas avanzadas de análisis de registro como por ejemplo Logcheck.


Herramientas avanzadas de análisis de registros: Logcheck
Los creadores de Logcheck entienden que por defecto todos los mensajes son interesantes excepto aquellos que han sido marcados explícitamente como ruido, y por ello Logcheck exige una alta personalización. Si usted no es excesivamente paranoico, puede usar la base de datos de mensajes de registros comunes y sin interés, para filtrar el ruido, ya incluido con la herramienta logcheck.

En cualquier caso, ya sea usted quien define que es ruido o no, o use la base de datos de Logcheck, tras instalar-lo deberá llevar a cabo una configuración básica.

1.- Permitir el acceso de logcheck a los archivos de registro
Logcheck ha sido ideado para funcionar sin privilegios de superusuario, de hecho no puede ser ejecutado como root, por lo que debe configurar rsyslog de forma que permita la lectura de los archivos de registros a los miembros del grupo logcheck. Para ello tan solo deberá agregar las siguientes directivas al archivo de configuración de rsyslog:
  • $FileCreateMode 0640
  • $FileOwner rsyslog
  • $FileGroup logcheck

Recuerde que deberá recargar la configuración de rsyslog, reiniciando el demonio o pasando-le la opción reload.

2.- Ajustar la configuración de /etc/logcheck/logcheck.conf
Al menos deberá ajustar el nivel de filtrado (REPORTLOVEL="") y la dirección de correo donde quiere recibir los reportes (SENDMAILTO=""). Aunque es recomendable que revise todo el archivo de configuración.
# Controls the level of filtering:
# Can be Set to "workstation", "server" or "paranoid" for different
# levels of filtering. Defaults to server if not set.

REPORTLEVEL="server"

# Controls the address mail goes to:
# *NOTE* the script does not set a default value for this variable!
# Should be set to an offsite "emailaddress@some.domain.tld"

SENDMAILTO="antonio@makeinstall.es"

3.- Ajustar la configuración de /etc/logcheck/logcheck.logfiles
A continuación deberá indicar a Logcheck los archivos de registro que deberá escanear, filtrar y reportar a la dirección indicada.
agd-desktop # nano /etc/logcheck/logcheck.logfiles
# these files will be checked by logcheck
# This has been tuned towards a default syslog install
/var/log/syslog
/var/log/auth.log

4.- Ajustar la configuración de /etc/cron.hourly/logcheck.cron
En este punto usted tan solo deberá descomentar la tarea cron de /etc/cron.hourly/logcheck.cron para comenzar a recibir reportes de alta calidad en su correo electrónico.dirección indicada.
agd-desktop # nano /etc/cron.hourly/logcheck.cron
#!/bin/bash
#
# Please uncomment the following if you want logcheck to run hourly.

#su -s /bin/bash -c /usr/sbin/logcheck logcheck

3 comentarios:

#
Mr. Brown Dispatcher dijo...

Pues ya tienes un primer comentario, y estás enlazado, que me ha gustao lo que que he visto.

#
Antonio Guillen dijo...

#1 gracias :-)

#
abima dijo...

Muy buena explicación, muchas gracias.
:D

Publicar un comentario en la entrada

Recuerde que puede utilizar algunos códigos HTML como <b>para negrita</b>, <i>para cursiva</i> y <a href="URL">para enlaces</a>.