Nginx: cómo configurar access log y error log

En esta entrada vamos a ver la forma de configurar los nginx access log y error log.

En Nginx, el módulo encargado de gestionar los logs es ngx_http_log_module, ofreciendo la posibilidad de personalizar el formato del log (directiva log_format) así como la ubicación tanto de los logs de acceso (access_log) como de errores (error_log), ambos con granularidad de contexto.

log_format

Esta directiva especifica el formato de los logs para un determinado contexto, en este caso, el único contexto válido es el bloque «http«, que es el que contiene la mayor parte de configuraciones globales de Nginx.

Por defecto, el formato es de tipo «combined«, que es el clásico que también solemos ver en otros servidores web como Apache. Es un formato que «combina» una serie de campos para cada registro del log, ejemplo:

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

Las variables disponibles las podéis encontrar en la documentación del módulo en el sitio web de Nginx. Algunos ejemplos: $bytes_sent, $connection, $connection_requests, $msec, $pipe, request_length, $request_time, $status.

Hay opciones más avanzadas, como especificar que el formato del log sea json:

 	log_format name [escape=default|json|none] string ...;

Ejemplo:

log_format json_combined escape=json
  '{'
    '"time_local":"$time_local",'
    '"remote_user":"$remote_user",'
    '"remote_addr":"$remote_addr",'
    '"request":"$request",'
    '"status": "$status",'
    '"body_bytes_sent":"$body_bytes_sent",'
    '"http_referrer":"$http_referer",'
    '"http_user_agent":"$http_user_agent"'
  '}';

Para un servidor web estándar, la configuración por defecto suele ser suficiente. También es posible establecer envío de log a syslog. Echad un vistazo a la documentación oficial si os interesa.

access_log

La directiva access_log, permite especificar la ubicación y configuración del registro de logs de acceso. Al contrario que log_format, tiene granularidad para los contextos http, server, location, if in location y limit_except, lo que permite configurar logs independientes y con configuración personalizada para cada contexto/bloque. La sintaxis es la siguiente:

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;

Lo más habitual es especificar simplemente la ruta donde almacenarlo y, opcionalmente, el log_format específico de este log:

access_log logs/access.log combined;

Así podríamos, por ejemplo, tener un access log distinto para cada bloque server e incluso location, ejemplo:

http {
    log_format compression '$remote_addr - $remote_user [$time_local] '
                           '"$request" $status $body_bytes_sent '
                           '"$http_referer" "$http_user_agent" "$gzip_ratio"';
    access_log /var/log/nginx/foo.log
    server {
        gzip on;
        access_log /var/log/nginx/bar.log compression;
        [...]
    }
}

También existe la opción de habilitar compresión gzip al log y/o buffering. Ejemplo:

access_log /var/log/access.log compression buffer=32k;

error_log

Esta directiva permite especificar un log dedicado para el registro de errores, con opción de especificar la granularidad de registro según la severidad de los mensajes (warn, error crit, alert, emerg…).

Por defecto hay un log global que registra con severidad «error» ubicado en el directorio logs del path de instalación de Nginx:

logs/error.log # El path absoluto depende de la instalación

Si por ejemplo quisiéramos subir el nivel de severidad y que registrara en modo «emerg», quedaría así:

error_log logs/error.log emerg;

Los contextos en los que podemos definir esta directiva son http, stream, server y location, de modo que en el momento que lo activamos tiene preferencia sobre los niveles superiores. En el caso de tener varios error_log en un mismo nivel, los mensajes de error se registrarán en todos los logs que haya al mismo nivel, duplicaríamos información.

A grandes rasgos estos sería lo más básico en lo que a configuración de logs en Nginx se refiere. Espero que os haya sido de ayuda para establecer una configuración inicial de logging en vuestro servidor web.