rsyslog интеграция, форматы логов, correlation ID, аудит запросов
Rsyslog интеграция, форматы логов, correlation ID, аудит запросов.
global
log /dev/log local0 info
log-tag haproxyПараметры:
/dev/log — сокет sysloglocal0 — facility (local0-local7)info — уровень (debug, info, notice, warning, err)log-tag — тег для syslogdefaults
log global
option httplog
option dontlognullПараметры:
log global — наследовать настройки из globaloption httplog — детальный HTTP форматoption dontlognull — не логировать пустые соединения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] — timestampfrontend — имя frontendbackend/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
| Поле | Название | Описание |
|---|---|---|
| Tq | Time Queue | Время в очереди |
| Tw | Time Wait | Время ожидания свободного соединения |
| Tc | Time Connect | Время установки соединения с backend |
| Tr | Time Response | время ожидания ответа от backend |
| Ta | Time Active | Общее время (сумма) |
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 — запрос с кавычками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"}Создадим /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
}
global
log remote-syslog.example.com:514 local0 infoRsyslog на сервере:
# /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
# Приём от HAProxy
local0.* /var/log/haproxy-remote.log
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Преимущества:
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_serversglobal
log /dev/log local0 debugКогда использовать:
Объём логов: Очень большой
global
log /dev/log local0 infoКогда использовать:
Объём логов: Средний
global
log /dev/log local0 noticeКогда использовать:
Объём логов: Маленький
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 домен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
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_serversglobal
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_serversRsyslog:
local0.* /var/log/haproxy-web.log
local1.* /var/log/haproxy-admin.log
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# Просмотр в реальном времени
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
sudo systemctl status rsyslog
# Проверка конфигурации
sudo rsyslogd -N1
# Перезапуск
sudo systemctl restart rsyslog# Отправить тестовое сообщение
logger -p local0.info "Test HAProxy log message"
# Проверить лог
tail /var/log/haproxy.log# ✅ Хорошо (структурированный)
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Изучим мониторинг: Prometheus, Grafana, HAProxy Dataplane API.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.