По умолчанию Nginx ведёт логи в текстовом формате, но уже давно умеет писать их в JSON. Однако, в большинстве конфигураций всё ещё используются старые текстовые логи. Если вы до сих пор не перешли на JSON, самое время это сделать – его проще анализировать вручную и обрабатывать в автоматизированных системах.
⚙️ Настройка JSON-логов в Nginx. Включить JSON-формат просто – достаточно добавить новую директиву
log_format в конфигурационный файл:
log_format json_combined escape=json '{'
'"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"remote_user":"$remote_user",'
'"request":"$request",'
'"status":"$status",'
'"body_bytes_sent":"$body_bytes_sent",'
'"request_time":"$request_time",'
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent"'
'}';
Добавляем в http { } или в настройки виртуального хоста:
access_log /var/log/nginx/access.log json_combined;
После перезапуска Nginx сервер начнёт записывать логи в JSON.
🌟 Почему это удобно?
Если вы используете Zabbix, ELK (Elasticsearch + Logstash + Kibana), Grafana или другие системы мониторинга – обработка JSON-логов упростится, так как для него уже есть готовые парсеры.
Но даже в консоли JSON-логи обрабатывать намного удобнее с помощью jq:
▪️ Вывод всех логов в формате JSON:
jq '.' access.log
▪️ Список всех запрашиваемых URL:
jq '.request' access.log
▪️ Фильтр по коду ответа 404 (показывает всю запись):
jq '. | select(.status=="404")' access.log
▪️ Вывод только URL с кодом 404:
jq '. | select(.status=="404") | .request' access.log
▪️ Добавляем к URL ещё и время запроса:
jq '. | select(.status=="404") | .time_local, .request' access.log
▪️ Вывод значений без кавычек (флаг -r):
jq -r '.request' access.log
🌟 Дополнительные переменные для логов. К стандартным переменным можно добавить полезные параметры:
Метрики запроса и прокси-серверов:
$request_length – длина запроса
$upstream_addr – адрес upstream-сервера
$upstream_status – HTTP-ответ от upstream
$upstream_response_time – время ответа backend'а
$upstream_connect_time – время установки соединения с upstream
$upstream_header_time – время получения HTTP-заголовков от upstream
Безопасность и TLS:
$server_name – имя виртуального хоста
$ssl_protocol – используемый TLS-протокол
$ssl_cipher – алгоритм шифрования
#Nginx #JSON
🧑💻 NetworkAdmin