[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Generación dinámica de archivo de log con rsyslog



El 09/05/14 02:48, C. L. Martinez escribió:
2014-05-08 17:19 GMT+00:00 Mauro Antivero <mauro.antivero@gmail.com>:
Estimados, estoy tratando de hacer que rsyslog me escriba determinados logs
en distintos directorios según la fecha. El siguiente es un ejemplo que
funciona, pero no hace lo que quiero (osea, en este caso se guarda todo en
un mismo archivo en /var/log/rsyslog/rsyslog.log):

ruleset(name="remote"){
    if $fromhost-ip == '192.168.0.5' then {
        action(type="omfile" file="/var/log/rsyslog/syslog.log")
        stop
        }

Y lo que quiero en realidad es algo de este tipo:

ruleset(name="remote"){
    if $fromhost-ip == '192.168.0.5' then {
        action(type="omfile" file="/var/log/rsyslog/año/mes/día/syslog.log")
        stop
        }

Pero no logro hacerlo andar. Intenté con las propiedades, pero no he podido.
Usando el formato de sintaxis viejo si he podido, pero no es aconsejable
usar dicha sintaxis. Lo que si funciona es lo siguiente:

template(name="CustomFormat_Hosts" type="string"
String="%$year%-%$month%-%$day% %$hour%:%$minute% %hostname% %syslogtag%
%msg%\n")

ruleset(name="remote"){
    if $fromhost-ip == '192.168.0.5' then {
        ?CMTS;CustomFormat_Hosts
        stop
        }

En este caso como ven uso las propiedades pero en el string generado con el
template. Luego en la regla configuro que todos los mensajes de log que
vengan del host 192.168.0.5 sean guardados en una estructura como la que yo
deseo.
Bueno, el tema documentación en rsyslog solo tiene un calificativo:
desastroso. Pero, es superable :)). A ver, de entrada está mezclando
sintaxis antigua con sintaxis nueva.

De entrada, ¿que versión rsyslog estás utilizando? Por solo tienes dos opciones:
Perdón, estoy usando la 8.2.1

a) Configurar todo con sintaxis antigua.
b) Configurar todo con sintaxis nueva.
Estoy tratando de ir por la b.

Ahora mismo lo has mezclado todo. Yo nunca he tratado de hacer lo que
estás intentando (básicamente porque sería infumable gestionar en
archivos planos el alto volumen de logs que debo gestionar), pero te
pongo un ejemplo de como utilizar los templates en sintaxis nueva
(versiones 6.x en adelante):


#### Templates definitions ####

$template idp01_rfc5424fmt,"suricata idp01 %fromhost-ip% %msg%\n"
Esta ($template) es justamente la sintaxis vieja. La nueva es del tipo template(name="...").


if $syslogtag == 'idp01' then {
        action(type="omfwd" protocol="tcp" target="172.17.22.1"
port="10514" template="suricata01_rfc5424fmt"
                queue.filename="suricata01fwd"
                queue.maxdiskspace="10g"
                queue.saveonshutdown="on"
                queue.type="linkedlist"
                queue.maxfilesize="5m"
                action.resumeretrycount="-1")
        stop
}

Como ves, la forma de utilizar el template difiere mucho de como la
has configurado.
Es que ese es un template distinto, vos ahí estás usando el módulo "omfwd", que no lo conozco pero supongo que hace forward hacia donde vos le indiques (172.17.22.1). Yo en todo caso quiero usar el módulo "omfile" y que el archivo sea generado dentro de una estructura de directorios que indique el año/mes/día. El tema es que si lo quiero hacer con la sintaxis:

action(type="omfile" file="/var/log/rsyslog/año/mes/día/syslog.log")

No logro hacer que me tome como nombre de directorios al año, al mes y al día, ya que no me reconoce las "propierties" ($year, $month y $day).

Como decía, lo que me funciona es lo siguiente:

template(name="HOSTS" type="string" string="/var/log/rsyslog/%$year%/%$month%/%$day%/%hostname%/syslog.log")
template(name="CustomFormat_Hosts" type="string" String="%$year%-%$month%-%$day% %$hour%:%$minute% %hostname% %syslogtag% %msg%\n")

ruleset(name="remote"){
    if $fromhost-ip == '192.168.0.5' then {
        ?CMTS;CustomFormat_Hosts
        stop
        }

Que en respuesta a lo que está más abajo fijate que no tengo en cuenta las horas y los minutos para la generación de la ruta, sino que la ruta es año/mes/día/syslog.log y lo que se guarda dentro de este archivo es:

año-mes-día hora:minuto host tag mensaje /n

Pido disculpas porque en el correo original me olvidé de incluir el template "HOSTS" que es el que define el string para la ruta al archivo, y esto puede haber generado confusiones.

En resumen, de esta manera (usando ?CMTS;CustomFormat_Hosts luego del "then") me funciona, pero no sé si eso no es justamente el formato viejo. Me gustaría dejarlo con una sentencia tipo "action", pero eso es lo que no puedo hacer.

 Prueba a ajustarla. Creo que la definición del propio
template es correcta.
Si, los dos templates (el de la generación dinámica de la ruta y el que indica que es lo que se debe escribir dentro del archivo) funcionan perfectamente :)

 Por cierto, ¿estás seguro que quieres crear
directorios de hora y minuto?. Yo no lo haría porque dependiendo del
volumen, ya puedes tener un disco muy muy rápido en escritura. Piensa
que rsyslog está pensado para trabajar con +100K EPS ... O sea que
puede llevar a tu disco de cabeza :))
Te entiendo perfectamente, pero como explicaba más arriva esto no es lo que hice.

Saludos.


Saludos y muchas gracias.

Mauro.

Reply to: