3. Rsyslog

Rsyslog – rocket-fast syslog

Fichero de configuración:  /etc/rsyslog.conf


 

Además de una mayor eficiencia, el objetivo de rsyslog es soportar varias fuentes  y pozos para los mensajes de log. No solamente escribe los mensajes a ficheros de texto y terminales, si no también a una amplia selección de bases de datos.

 

Funciona de la siguiente forma:
Las fuentes pasan los mensajes a los «conjuntos de reglas». Hay un conjunto por defecto, RSYSLOG_DefaultRuleset, pero se pueden definir más.

Cada conjunto de reglas puede contener tantas como se quiera (o ninguna)
Una regla consiste en un filtro y una lista de acciones. Los filtros realizan acciones sí/no acerca de la ejecución de las acciones pertinentes.

Para cada mensaje, todas las reglas se ejecutarán en orden descendente, de primera a la última. Todas las reglas se ejecutarán, aunque haya una orden de detención por el medio.

Una lista puede contener diversas acciones (por lo menos una). Sin lista de acciones, no se admiten más filtros. Las acciones determinan qué sucede con los logs que coinciden.

La apariencia de los logs puede ser controlada mediante plantillas.

 

El fichero de configuración:
En el fichero /etc/rsyslog.conf se pueden encontrar 3 estilos de configuración diferentes:
· La sintaxis tradicional de /etc/syslog.conf (sysklogd)
· Una sintaxis obsoleta de rsyslog. Se reconoce por comandos que comienzan con $
· La sintaxis actual de rsyslog (RainerScript). Bien adaptada a situaciones complejas

Las dos primeras opciones están basadas en líneas, la última no atiende a los saltos de línea. Se recomienda solamente el uso de la última opción para realizar configuraciones en el fichero de rsyslog.

 

Filtros extendidos

:msg, contains, "FOO" /var/log/foo.log

Consisten en:
· «:» en el margen izquierdo
· una propiedad que syslog toma del mensaje, «msg»
· un filtro, aquí, «contains»
· y un término de búsqueda, «FOO»

Además de «msg», el mensaje de log en sí, las propiedades que se pueden incluír son:
· hostname: nombre del equipo que envía el mensaje
· fromhost: nombre del equipo que envía el mensaje a rsyslog
· pri: categoría y prioridad del mensaje como número sin codificar
· pri-text: categoría y prioridad del mensaje como cadena de texto, con el  número añadido (local0.err<133>)
· syslogfacility y syslogseverity así como syslogfacility-text y syslogseverity-text: para acceder directamente a la categoría y prioridad
· timegenerated: cuándo ha sido recibido el mensaje
· inputname: el módulo de rsyslog que ha recibido el mensaje
Y más, revisar la documentación de rsyslog de ser necesairo.

Los operadores de comparación permitidos son:
· contains: contiene la cadena de texto
· isequal: la cadena de texto es igual a la dada
· startswith: la cadena de texto empieza con (más eficiente que utilizar regex, aunque puede que lo que tú consideres el inicio del mensaje y lo que rsyslog considere no sean lo mismo:
EJEMPLO:

<131>Jul 22 14:25:50 root: error found

El mensaje comienza a partir de «:», por lo que la sintaxis sería para filtrar estos errores sería (véase el espacio antes de error)

:msg, startswith, " error" /var/log/error.log

· regex: expresión regular simple de acuerdo a POSIX
· eregex: expresión regular extendida de acuerdo a POSIX

 

Si se desean enviar los mensajes a otra máquina a través de la red, lo que con syslog sería «local0.* @red.example.com», lo cual transmite los mensajes a través de UDP al host de destino, con rsyslog además se permite «local0.* red.example.com», utilizando así TCP. Por supuesto, al otro lado debe haber un rsyslog correctamente configurado, se puede comprobar con la siguiente sintaxis:

module(load="imtcp" MaxSessions="500")
input(type="imtcp" port="514")

Los mensajes se transmisten por defecto al puerto 514/UDP, dicho puerto en TCP está reservado para rsh (remote shell, nadie lo utiliza hoy en día), se puede utilizar otro de la siguiente forma:

local0.* @@red.example.com:10514

Los cambios a implementar del lado del servidor pasan por configurar el puerto de escucha.

 

Siguiente nivel de complejidad, filtros basados en expresiones que pueden contener expresiones arbitrarias tales como booleanas, aritméticas o cadenas de operación, comienzan simepre con if y deben ser definidos en una línea (similar a los condicionales if de bash):

if $syslogfacility-text == "local0" and $msg startswith " FOO" and ($msg contains "BAR" or $msg contains "BAZ") then /var/log/foo.log

Rsyslog soporta un gran número de módulos que determinan lo que sucederá con los logs. Se puede, por ejemplo, enviar los mensajes por correo:

module(load="ommail")
template(name="mailBody" type="string" string="ALERT\\r\\n%msg%")
if $msg contains "disk error" then {
action(type="ommail" server="mail.example.com" port="25"
mailfrom="rsyslog@example.com" mailto="admins@example.com"
subject.text="disk error detected"
body.enable="on" template="mailBody"
action.execonlyonceeveryinterval="3600")
}

Se trata de una implementación primitiva de SMTP que no soporta encriptación ni autenticación, el servidor que lo recibe debe estar configurado acorde a esto.

 

Además, rsyslog acepta por sí mismo los mensajes del kernel con el módulo imklog, por lo que no se necesita klog:

module(load="imklog")

Toda la información en
www.rsyslog.com/doc/master/index.html

Deja un comentario