Как в nginx исключить IP из логов?

Представим ситуацию: у вас статичный ip и вы много и подолгу занимаетесь редактированием сайта. При этом, вам ещё нужно мониторить, периодически, логи на наличие ошибок в запросах, или на сканы уязвимостей. А наличие большого количество записей с вашим IP затрудняет просмотр логов.

Как в nginx исключить IP из логов?

При помощи условной записи, которая доступна в nginx, начиная с версии 1.7.0, мы можем проверять ip посетителя и не записывать его в лог-файлы. Действительно, зачем это делать, если в логгировании своего айпи нет необходимости?

Чтобы добавить такое исключение, нужно создать условную запись на основе map_module. Результат вычисления условной записи не будет записываться в лог, если будет равен 0. Правило будет выглядеть так:

map $remote_addr $loggable {  "127.0.0.1" 0;  "::1" 0;  default 1; }

То есть, по-умолчанию результат равен 1, а для указанных ip — 0, и они не будут записаны в лог. Поддерживаются версии протокола 4 и 6. Обратите внимание, здесь первая переменная — это адрес подключившегося клиента. А вторую переменную нужно записать в параметрах access лога.

access_log /var/log/nginx/access.log combined if=$loggable;

Блок map можно прописать как на уровне http конфига nginx, так и на уровне server.

Исключение других данных из логов

Отключение логгирования конкретных ip — это только один пример из множества. Можно использовать различные переменные из стандартных.

Давайте отключим, в качестве примера, запись в лог страницы error.html. Для этого создадим такой блок:

map $request_uri $loggable {  ~*error.html 0;  default 1; }

И пропишем, как выше, параметр if в качестве аргумента для параметра access_log. После перезапуска nginx все запросы error.html не будут записаны. Включая вариации типа error.html?q=search. Для точного совпадения нужно прописать другое регулярное выражение.