Как экспортировать журнал доступа nginx в сокет, а не в файл?

Я хочу отправить журналы, созданные nginx, в influxdb. Чтобы справиться с этим, у меня есть агент, который может его форматировать, извлекать некоторые геоданные, создавать геохеш и т. д.

Проблема в том, что nginx и агент работают в отдельных контейнерах docker, а nginx является производителем, который может только записывать в файловую систему, а agent способен только читать из сети (например, какой-то поток tcp, веб-сокет или http, поскольку он обычно делается в webdev)

Я не хочу делиться томом access.log между контейнерами, тратить место и долго анализировать километры журналов.

Как заставить nginx записывать лог напрямую в какой-нибудь сокет tcp?


person xakepp35    schedule 04.09.2019    source источник


Ответы (1)


запись журнала nginx напрямую в какой-либо сокет tcp небезопасна,
так как запись в сокет может замедлить или даже заблокировать nginx

nginx можно настроить на регистрацию в системном журнале
если agent может читать системный журнал

access_log syslog:server=syslog_server_ip:sys_log_server_port,facility=local7,tag=nginx,severity=info;

если вы полны решимости выполнить пользовательскую переадресацию, вот еще один простой, но ошибочный способ
настроить nginx для записи в именованный канал, отправить его с помощью ncat

mkfifo /var/log/nginx/access.log  
ncat  agent_ip agent_port 0</var/log/nginx/access.log

это ошибка, потому что ncat должен быть перезапущен вручную, когда происходит отключение
супервизор может помочь при перезапуске
но несколько строк журнала могут быть потеряны, когда они удерживаются ncat, но не отправляются по сети

flume — лучший инструмент для такой пересылки журналов

person bigdataolddriver    schedule 04.09.2019
comment
Спасибо. Я закончил реализацию сервера системного журнала, который анализирует выходные данные nginx в формате influxdb, добавляет геохэш и отправляет в influxdb для сопоставления. И иногда запись на жесткий диск /var/log/nginx может замедляться, в отличие от записи в локально развернутое приложение... - person xakepp35; 04.09.2019
comment
@xakepp35 Ну, вы могли бы просто использовать fluentd - person Markus W Mahlberg; 03.10.2019