Логирование в nginx

Настраиваем access и error логи в JSON


Зачем нужны логи в JSON?

Логи в JSON легко разбирать программно:

Два типа логов в nginx

  1. Для каждого запроса добавляется запись в access log
  2. Ошибки, предупреждения и другие подобные сообщения пишутся в error log

Можно разделять логи по разным критериям — например, один nginx обслуживает несколько доменов и для каждого пишет отдельный access log и error log.

Директивы, связанные с логами:

Директива Описание Где можно использовать
access_log Путь к access log http, server, location и др.
log_format Формат access log http
error_log Путь к error log и минимальный уровень main, http, server, location и др.

Access логи в JSON

Пример для nginx в docker контейнере:

log_format main escape=json
'{'
'"@timestamp": "$time_iso8601", '
'"status": "$status", '
'"host": "$host", '
'"request": "$request", '
'"client_ip": "$remote_addr", '
'"referer": "$http_referer", '
'"request_time": "$request_time", '
'"request_length": "$request_length", '
'"user_agent": "$http_user_agent" '
'}';

server {
    # ... другие параметры

    server_name example.ru example.local localhost;

    access_log /dev/fd/1 main;
}

В этом примере:

  1. Мы задали формат с именем "main" директивой log_format, а затем использовали его в директиве access_log
  2. Логи пишутся в формате JSON в стандартный поток вывода (stdout, в docker контейнере ему соответствует /dev/fd/1)
  3. Набор логируемых полей подходит для статического сайта

Если вы запускаете nginx не в docker контейнере, а качестве обычного системного сервиса, то следует логировать в файл:

server {
    # ... другие параметры

    server_name example.ru example.local localhost;

    access_log /var/log/nginx/example-access.log main;
}

Если вы используете nginx на Windows, то настраивайте пути в формате данной ОС.

Error логи в nginx

Пример для nginx в docker контейнере:

server {
    # ... другие параметры

    error_log stderr warn;
}

В этом примере:

  1. Error логи пишутся в стандартный поток ошибок (stderr)
  2. В них попадают сообщения уровней emerg, alert, crit, error, warn
  3. В них не попадают сообщения уровней notice и debug, т.к. эти уровни ниже уровня warn

Если вы запускаете nginx не в docker контейнере, а качестве обычного системного сервиса, то следует логировать в файл:

server {
    # ... другие параметры

    server_name example.ru example.local localhost;

    error_log /var/log/nginx/example-error.log warn;
}