Saltar la navegación

Cláusua logging

El servidor BIND envía mensajes log para indicar múltiples situaciones por las que pasa, que van desde simples informaciones hasta notificaciones de errores. Estos mensajes log, tanto del servidor BIND como de otros servicios, los maneja en Debian el demonio rsyslogd (/usr/sbin/rsyslogd) a través del protocolo SYSLOG, y por defecto acaban en el fichero /var/log/syslog, mezclado con todos los demás mensajes log. Esto último se puede cambiar si estamos interesados en separar los log del servidor BIND de los demás, si no, también podemos ejecutar el siguiente comando que filtra los mensajes que llevan la palabra named, que es el nombre del demonio de BIND y todos sus mensajes log lo llevan:

fgrep named /var/log/syslog

Los mensaje log pertenecen a una categoría y poseen una prioridad. Las categorías pueden ser: auth, authpriv, cron, daemon, kern, lpr, mail, mark, news, syslog, user, uucp y local0 hasta local7. Si no se especifica otra cosa, los log del servidor BIND son de la categoría daemon. Por otro lado, a cada log se le asigna una prioridad, que puede ser una de las siguientes ordenadas de menor a mayor prioridad: debug, info, notice, warning, err, crit, alert y emerg.

En el fichero /etc/rsyslog.conf se configura el comportamiento de rsyslogd, indicando entre otras cosas, en qué ficheros se guardan los mensajes log según su categoría y prioridad. Si queremos que los mensajes log del servidor BIND se guarden en un fichero aparte, seguiremos los siguientes pasos:

  1. En primer lugar haremos que los log de BIND se emitan con la categoría local0 en vez de la categoría deamon que usa por defecto, ya que esta es utilizada también por otros servicios. Esto lo haremos ayudándonos de la siguiente cláusula logging (solo se puede poner una), que añadiremos a named.conf:
logging {
    category default { mi_canal_log; };
    channel mi_canal_log {
        syslog local0;
        print-severity yes;
        print-category yes;
    };
};
  1. En el fichero /etc/rsyslog.conf añadimos la línea "local0.info /var/log/bind.log" para que todos los log de la categoría local0 y prioridad info o superior se escriban en el fichero /var/log/bind.log.
  2. Creamos el fichero vacío /var/log/bind.log, pues rsyslogd no lo crea.
  3. Reiniciamos los servicios con /etc/init.d/rsyslog y /etc/init.d/isc-dhcp-server.

Otra forma de hacer lo mismo es explotando más las posibilidades que da la cláusula logging de BIND, que nos permite hacerlo todo desde BIND sin tocar a rsyslogd. Veamos como funciona todo esto.

El sistema log de BIND se basa en dos conceptos, el de canal y el de categoría.

Un canal define a dónde se enviarán los mensajes log, y puede ser a un fichero, a rsyslogd, a la salida estándar de error o a ningún sitio (null). Además puede llevar asociado algunos detalles que veremos más adelante.

Una categoría agrupa a todos los mensajes log de BIND que tienen una causa similar. Estas categorías ya están creadas, y son: default, network, database, security, etc. De todas estas la que más nos va a interesar es la categoría default, que representa a todas las categorías que no se hayan especificado explícitamente dentro de la cláusula logging.

La cláusula logging va a ser la siguiente:

logging {
    category default { mi_canal_log; };
    channel mi_canal_log {
        file "/var/log/bind/bind.log" versions 3 size 100k;
        print-time yes;
        print-category yes;
        print-severity yes;
    };
};

Este trozo de código lo tendremos que poner, como ya se ha dicho, dentro de named.conf, pero siguiendo la filosofía de distribuir la configuración, también lo podríamos poner dentro de un fichero que crearíamos con el nombre named.conf.logging, y lo añadimos dentro de named.conf con la cláusula include .

Veamos cada una de las líneas del código anterior.

    category default { mi_canal_log; };

La sentencia category lo que hace es asociar una categoría de mensajes log de BIND a un canal, es decir, a donde se enviarán dichos mensajes. Esta sentencia se puede repetir para cada una de las categorías de mensajes log. Como se ha dicho, la categoría default incluye a todas las categorías que no están explícitamente en una sentencia category, y como en el ejemplo no se ha escrito ninguna, entonces default se refiere a todos los mensajes log de BIND; por lo tanto, todo va a mi_canal_log.

Definimos el canal:

    channel mi_canal_log {

El destino será un fichero, que rotará tres veces (bind.log, bind.log.0, bind.log.1, bind.log.2) cada vez que llegue a los 100KB de tamaño:

        file "/var/log/bind/bind.log" versions 3 size 100k;

Hay que recordar que el demonio named de BIND lo ejecuta el usuario bind, por lo que los fichero bind.log* los crea y modifica dicho usuario. Para no tener problemas de permisos, pues bind no puede crear ficheros en /var/log, lo mejor es crear el directorio /var/log/bind asignándole bind como usuario y grupo.

Por último, queremos que los mensajes log que pasen por mi_canal_log vayan acompañados de la fecha y la hora en la que se produjo, la categoría BIND y la prioridad:

        print-time yes;
        print-category yes;
        print-severity yes;

Licencia: licencia de software libre GPL