Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Логирование и аудит
logging_audit

Логирование и аудит

rsyslog интеграция, форматы логов, correlation ID, аудит запросов

Логирование и аудит в HAProxy

Rsyslog интеграция, форматы логов, correlation ID, аудит запросов.

#Базовое логирование

#Глобальная настройка

global log /dev/log local0 info log-tag haproxy

Параметры:

  • /dev/log — сокет syslog
  • local0 — facility (local0-local7)
  • info — уровень (debug, info, notice, warning, err)
  • log-tag — тег для syslog

#Логирование в defaults

defaults log global option httplog option dontlognull

Параметры:

  • log global — наследовать настройки из global
  • option httplog — детальный HTTP формат
  • option dontlognull — не логировать пустые соединения

#Форматы логов

#HTTP log формат

192.168.1.100:54321 [15/Jan/2024:10:23:45.123] 
  frontend backend/server 0/0/1/15/16 200 1234 
  - - ---- 1/1/0/0/0 0/0 "GET /api/users HTTP/1.1"

Разбор:

  • 192.168.1.100:54321 — клиент IP:port
  • [15/Jan/2024:10:23:45.123] — timestamp
  • frontend — имя frontend
  • backend/server — backend/сервер
  • 0/0/1/15/16 — тайминги (см. ниже)
  • 200 — статус ответа
  • 1234 — размер ответа в байтах
  • "GET /api/users HTTP/1.1" — запрос

#Тайминги

0/0/1/15/16 = Tq/Tw/Tc/Tr/Ta
ПолеНазваниеОписание
TqTime QueueВремя в очереди
TwTime WaitВремя ожидания свободного соединения
TcTime ConnectВремя установки соединения с backend
TrTime Responseвремя ожидания ответа от backend
TaTime ActiveОбщее время (сумма)

#Custom log format

global log /dev/log local0 info defaults log global log-format "%ci:%cp [%tr] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %CC %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r"

Переменные:

  • %ci — client IP
  • %cp — client port
  • %tr — timestamp
  • %ft — frontend
  • %b/%s — backend/server
  • %TR/%Tw/%Tc/%Tr/%Ta — тайминги
  • %ST — статус ответа
  • %B — размер ответа
  • %{+Q}r — запрос с кавычками

#JSON log format

log-format "{\"time\":\"%tr\",\"client\":\"%ci:%cp\",\"frontend\":\"%ft\",\"backend\":\"%b\",\"server\":\"%s\",\"status\":%ST,\"bytes\":%B,\"request\":\"%[+Q]r\",\"method\":\"%HM\",\"path\":\"%HP\"}"

Пример вывода:

{"time":"15/Jan/2024:10:23:45.123","client":"192.168.1.100:54321","frontend":"https_front","backend":"web_servers","server":"web1","status":200,"bytes":1234,"request":"GET /api/users HTTP/1.1","method":"GET","path":"/api/users"}

#Rsyslog интеграция

#Настройка rsyslog

Создадим /etc/rsyslog.d/49-haproxy.conf:

# HAProxy логи
local0.* /var/log/haproxy.log

# Отключаем дублирование в syslog
& stop

Перезапуск:

sudo systemctl restart rsyslog

#Ротация логов

Создадим /etc/logrotate.d/haproxy:

/var/log/haproxy.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 haproxy haproxy
    sharedscripts
    postrotate
        systemctl reload rsyslog
    endscript
}

#Remote syslog

global log remote-syslog.example.com:514 local0 info

Rsyslog на сервере:

# /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514

# Приём от HAProxy
local0.* /var/log/haproxy-remote.log

#Correlation ID

#Добавление correlation ID

frontend http_front bind *:80 # Генерация correlation ID http-request set-header X-Request-ID %[uuid()] # Логирование correlation ID log-format "%ci:%cp [%tr] %ft %b/%s %ST %B rid=%[req.hdr(X-Request-ID)] %{+Q}r" default_backend web_servers

Преимущества:

  • Трассировка запроса через микросервисы
  • Упрощение отладки
  • Аудит безопасности

#Propagation correlation ID

frontend http_front bind *:80 # Использовать существующий или создать новый http-request set-header X-Request-ID %[req.hdr(X-Request-ID)] if { req.hdr(X-Request-ID) -m found } http-request set-header X-Request-ID %[uuid()] unless { req.hdr(X-Request-ID) -m found } default_backend web_servers

Поведение:

  • Если X-Request-ID есть — сохранить
  • Если нет — создать новый

#Аудит запросов

#Логирование только ошибок

defaults log global option httplog # Логировать только 4xx и 5xx log-format "%ci:%cp [%tr] %ft %b/%s %ST %B %{+Q}r" if { status gt 399 }

#Логирование медленных запросов

defaults log global # Логировать если время ответа > 1s log-format "%ci:%cp [%tr] %ft %b/%s %ST %B %Tr %{+Q}r SLOW" if { Tr gt 1000 }

#Логирование подозрительных запросов

frontend http_front bind *:80 # ACL для подозрительных запросов acl suspicious path_sub -i admin config .env .git acl suspicious path_sub -i wp-admin phpmyadmin # Логирование с пометкой log-format "%ci:%cp [%tr] %ft %b/%s %ST %B %{+Q}r SUSPICIOUS" if suspicious default_backend web_servers

#Уровни логирования

#Debug

global log /dev/log local0 debug

Когда использовать:

  • Development
  • Troubleshooting production issues
  • Временно для отладки

Объём логов: Очень большой

#Info

global log /dev/log local0 info

Когда использовать:

  • Production (стандарт)
  • Все запросы логируются

Объём логов: Средний

#Notice

global log /dev/log local0 notice

Когда использовать:

  • High-traffic production
  • Только важные события

Объём логов: Маленький

#Логирование SSL

frontend https_front bind *:443 ssl crt /etc/haproxy/certs/site.pem # Логирование SSL информации log-format "%ci:%cp [%tr] %ft %b/%s %ST %B ssl=%[ssl_fc_cipher] ssl_ver=%[ssl_fc_version] sni=%[ssl_fc_sni]" default_backend web_servers

Переменные:

  • %[ssl_fc_cipher] — cipher suite
  • %[ssl_fc_version] — версия TLS
  • %[ssl_fc_sni] — SNI домен

#Логирование health checks

backend web_servers option httpchk GET /health # Логирование health checks log-health-checks server web1 192.168.1.10:8080 check

Формат:

Server backend/server1 is DOWN, reason: Layer4 timeout, check duration: 5002ms
Server backend/server1 is UP, reason: Layer7 OK, check duration: 15ms

#Conditional логирование

#Логирование по ACL

frontend http_front bind *:80 acl is_api path_beg /api acl is_admin path_beg /admin # Разные логи для разных типов log-format "%ci:%cp [%tr] API %b/%s %ST %B %{+Q}r" if is_api log-format "%ci:%cp [%tr] ADMIN %b/%s %ST %B %{+Q}r" if is_admin default_backend web_servers

#Логирование в разные файлы

global log /dev/log local0 info log /dev/log local1 info defaults log global frontend http_front bind *:80 log /dev/log local0 info default_backend web_servers frontend admin_front bind *:8080 log /dev/log local1 info default_backend admin_servers

Rsyslog:

local0.* /var/log/haproxy-web.log
local1.* /var/log/haproxy-admin.log

#Full Example: Production logging

global log /dev/log local0 info log-tag haproxy # JSON формат для ELK/Splunk # log-format "{\"time\":\"%tr\",\"client\":\"%ci:%cp\",\"frontend\":\"%ft\",\"backend\":\"%b\",\"server\":\"%s\",\"status\":%ST,\"bytes\":%B,\"request\":\"%[+Q]r\",\"method\":\"%HM\",\"path\":\"%HP\",\"user_agent\":\"%[hdr(User-Agent)]\",\"request_id\":\"%[req.hdr(X-Request-ID)]\"}" defaults log global option httplog option dontlognull # Стандартный формат log-format "%ci:%cp [%tr] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %CC %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r" frontend https_front bind *:443 ssl crt /etc/haproxy/certs/site.pem # Correlation ID http-request set-header X-Request-ID %[uuid()] # Логирование медленных запросов log-format "%ci:%cp [%tr] %ft %b/%s %ST %B %Tr %{+Q}r SLOW" if { Tr gt 1000 } # Логирование ошибок log-format "%ci:%cp [%tr] %ft %b/%s %ST %B %{+Q}r ERROR" if { status gt 499 } default_backend web_servers backend web_servers option httpchk GET /health log-health-checks server web1 192.168.1.10:8080 check server web2 192.168.1.11:8080 check

#Troubleshooting логов

#Проверка логов

# Просмотр в реальном времени tail -f /var/log/haproxy.log # Поиск ошибок grep " 5[0-9][0-9] " /var/log/haproxy.log # Статистика по статусам awk '{print $15}' /var/log/haproxy.log | sort | uniq -c | sort -rn

#Проверка rsyslog

# Статус rsyslog sudo systemctl status rsyslog # Проверка конфигурации sudo rsyslogd -N1 # Перезапуск sudo systemctl restart rsyslog

#Тестирование логирования

# Отправить тестовое сообщение logger -p local0.info "Test HAProxy log message" # Проверить лог tail /var/log/haproxy.log

#Best Practices

#Формат

# ✅ Хорошо (структурированный) log-format "%ci:%cp [%tr] %ft %b/%s %ST %B %{+Q}r" # ✅ Для ELK/Splunk (JSON) log-format "{\"time\":\"%tr\",\"client\":\"%ci\",\"status\":%ST}" # ❌ Плохо (слишком много данных) # log-format "%ci:%cp [%tr] %ft %b/%s %ST %B %{+Q}r %{+Q}H %{+Q}h"

#Уровень логирования

# ✅ Production log /dev/log local0 info # ✅ Troubleshooting (временно) # log /dev/log local0 debug # ❌ Production (слишком много) # log /dev/log local0 debug

#Ротация

# ✅ Обязательно daily rotate 14 compress # ❌ Без ротации (заполнит диск) # /var/log/haproxy.log

Далее: Мониторинг и Stats