Логирование в nginx
Настраиваем access и error логи в JSON
Зачем нужны логи в JSON?
Логи в JSON легко разбирать программно:
- Легко положить в ELK или другой стек для сбора логов
- Легко обработать своим скриптом — например, с помощью Python или JavaScript/Node.js
- Можно обработать и в консоли — например, утилитой
jq
Два типа логов в nginx
- Для каждого запроса добавляется запись в access log
- Ошибки, предупреждения и другие подобные сообщения пишутся в 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;
}
В этом примере:
- Мы задали формат с именем "main" директивой
log_format
, а затем использовали его в директивеaccess_log
- Логи пишутся в формате JSON в стандартный поток вывода (stdout, в docker контейнере ему соответствует
/dev/fd/1
) - Набор логируемых полей подходит для статического сайта
Если вы запускаете 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;
}
В этом примере:
- Error логи пишутся в стандартный поток ошибок (stderr)
- В них попадают сообщения уровней emerg, alert, crit, error, warn
- В них не попадают сообщения уровней notice и debug, т.к. эти уровни ниже уровня warn
Если вы запускаете nginx не в docker контейнере, а качестве обычного системного сервиса, то следует логировать в файл:
server {
# ... другие параметры
server_name example.ru example.local localhost;
error_log /var/log/nginx/example-error.log warn;
}