NGINX: access лог — логгирование всех запросов, кроме 200

Автор: | 03/19/2019
 

Задача — логгировать все запросы, кроме 200 ответов.

Подход с map можно использовать для совершенно разных вещей.

Например — задавать условия по наличию заголовка, и потом перенаправлять на различные location — попозже, наверно, добавлю такой пример.

Сейчас нас интересуют две возможности NGINX — «условное логгирование» для выбора условий, при которых будем заносить  события в журнал, и map для создания переменных со значениями других переменных.

map

В блоке http {} создаём переменную с именем $abnormal, в которой задаём значение 0 — если в коде ответа есть 200, или 1 — если нет:

http {

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    map $status $abnormal {
        ~^200  0;
        default 1;
    }
    ...

Conditional logging

А затем в блоке server {} задаём условие, используя if: если в $abnormal значение ноль — то не пишем ничего, а если значение 1, которое задано default параметром в map — то записываем:

server {

    charset utf-8;
    listen 80 default_server;
    server_name stage.example.com;

    if ($http_x_forwarded_proto = 'http') {
        return 301 https://stage.example.com$request_uri;
    }

    set $root_path /data/projects/frontend/web;
    root $root_path;

    index index.php;

    error_log /var/log/nginx/stage.example.com-error.log;
    access_log /var/log/nginx/stage.example.com-access.log combined if=$abnormal;

...

Проверяем:

127.0.0.1 - - [15/Mar/2019:14:51:37 +0200] "GET /nginx_status HTTP/1.1" 404 153 "-" "Go-http-client/1.1"
127.0.0.1 - - [15/Mar/2019:14:51:52 +0200] "GET /nginx_status HTTP/1.1" 404 153 "-" "Go-http-client/1.1"

Готово.