Пошаговое путешествие от коллекции журналов до визуализации
Вы не можете исправить то, что вы не знаете. Вот почему мы регистрируем события, чтобы получить четкое представление о том, что происходит в вашей системе, даже когда вы не смотрите. Журналы - один из лучших способов, а иногда и единственный вариант, чтобы выявить и исправить проблемы.
Как правило, приложения издают так много данных в живой среде, которая извлечения значимой информации из большого набора данных может быть исчерпывающим, особенно когда производственный технический стек запускает несколько типов приложений, каждый из которых выводит данные в своем собственном формате и часто разбросанный по системам. Вещи становятся все сложнее для разработчиков или инженеров DevOps, которые не являются опытными в инструментах текстовой обработки UnixgrepВsedВawkи т. д. Определение проблемы - это только первый шаг, и в производстве время никогда не на вашей стороне. В эти моменты мы все хотим, чтобы мы могли визуализировать все и мгновенно увидеть всю картину, а не просеивать бесконечные строки необработанных журналов и столбцов.
Управление или внедрение такой системы не является знакомым подвигом. Управляемые решения стоят денег или требуют от вас отправки данных за пределами вашей инфраструктуры, и не всегда легко оправдать большие деньги или компромиссы безопасности для чего-то, что не является прямым источником дохода. Есть так много вариантов, но они либо дороги, либо не хватает.
Попробовав множество комбинаций, я наконец нашел Святой Грааль для инфраструктуры регистрации:БеглыйиOpenBserveПолем Оба эти проекта являются открытым исходным кодом, имеют бесплатные версии, активно поддерживаются, могут легко самостоятельно самостоятельно и отлично работать в тандеме.
В этом руководстве мы создадим полный трубопровод для ведения журнала, от необработанных журналов Nginx до проглатывания и визуализации, используя Docker Compose для настройкиБеглыйиOpenBserveшаг за шагом. В конце концов, у вас будет полностью функциональная, сквозная система регистрации, которая может работать локально для разработки или адаптироваться для производственных сред.
Обзор архитектуры
Nginx записывает свои журналы доступа и ошибок на диск, где беглый бит поднимает их, обрабатывает их в соответствии с нашими требованиями и отправляет их в OpenBeserve через HTTP Ingestion. Logrotate автоматически обрабатывает вращение файлов журнала, предотвращая неконтролируемый рост и архивируя старые данные в соответствии с определенной политикой удержания.
OpenObserve сохраняет журналы, которые вставлены в магазин PostgreSQL Metadata, и делает их доступными для поиска и визуализации через его веб -интерфейс, как показано на диаграмме.
Настройка контейнеров NGINX, OpenObServe & PostgreSQL
Мы начнем с раскручивания трех контейнеров:NginxДля генерации журналов,Postgresqlкак магазин метаданных для OpenBeserve, иOpenBserveСам для проглатывания журналов, хранения и визуализации. Вотdocker-compose.ymlфрагмент:
name: logging-infra
services:
nginx:
image: nginx:alpine
container_name: nginx
ports:
- 127.0.0.1:8080:80
volumes:
- ./data/logs/nginx:/var/log/nginx
restart: always
depends_on:
- postgres
postgres:
image: postgres:17
container_name: postgres
ports:
- 127.0.0.1:5432:5432
volumes:
- ./data/postgres:/var/lib/postgresql/data
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=test1234
- POSTGRES_DB=openobserve
restart: always
openobserve:
image: openobserve/openobserve:v0.15.0-rc5
container_name: openobserve
ports:
- 127.0.0.1:5080:5080
volumes:
- ./data/openobserve:/data
environment:
- ZO_META_STORE=postgres
- ZO_COMPACT_DATA_RETENTION_DAYS=14
- ZO_ROOT_USER_EMAIL=test@mirzabilal.com
- ZO_ROOT_USER_PASSWORD=test1234
- ZO_META_POSTGRES_DSN=postgres://postgres:test1234@postgres:5432/openobserve?sslmode=disable
Примечания:
- Контейнер nginx будет хранить журналы
./data/logsПолем- Postgresql магазины Metadata OpenObserve в
./data/postgresПолем- Хранение данных в OpenObServe установлено на14 днейДля этой демонстрации, но вы можете настроить по мере необходимости.
После развертывания сdocker-compose up, вы сможете получить доступ к демонстрационному серверу Nginx наhttp://localhost:8080и сервер OpenObserve вhttp://localhost:5080Полем Вы также можете просмотреть журналы, генерируемые в./data/logs/nginxПолем
OpenBserve HTTP
Openbserve httpдругойИз учетных данных входа в панель панели. Хотя имя пользователя одинаково, пароль отличается. Именно здесь на помощь приходит отличная документация OpenObserve. После входа в приборную панель OpenObserve перейдите к:
Источники данных → Пользовательская вкладка → свободно бит
Вы увидите конфигурацию вывода вывода. В этой конфигурации найдитеPasswdпараметр -скопировать его значениеПолем Нам понадобится этот пароль на следующем шаге.
Настройка контейнера бегемого бита
На этом этапе у нас есть Nginx, генерирующие журналы и OpenBserve, готовые к их проглатыванию и визуализированию, но на самом деле ничто не отправляет журналы. Именно здесь появляется бегство. Безделивание пробежает файлы журнала Nginx, разрабатывает их в структурированные события и надежно перенаправить их в OpenBeserve, используя учетные данные HTTP API, которые мы только что получили.
Давайте добавимБеглыйобслуживание нашемуdocker-compose.ymlПолем Теперь обновитеOPENOBSERVE_API_PASSWORDпеременная среды с паролем, который мы сохранили на последнем шаге (отPasswdПоле в конфигурации образца бегемота OpenObServe). Это значение будет использоваться в файлах конфигурации бега Fluent для аутентификации с помощью OpenObServe.
fluent-bit:
image: fluent/fluent-bit:4.0.7
container_name: fluent-bit
volumes:
# Log volumes
- ./data/logs:/var/log/host:ro
- ./data/logs/fluentbit-out:/fluentbit-out
- ./data/logs/fluentbit-out/fluentbit-db:/fluentbit-db
# Mapping local config files and scripts
- ./config/fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf:ro
- ./config/parsers.conf:/fluent-bit/etc/parsers.conf:ro
- ./config/scripts:/fluent-bit/etc/scripts:ro
restart: always
environment:
- OPENOBSERVE_API_USERNAME=test@mirzabilal.com
- OPENOBSERVE_API_PASSWORD=T231Fquv # This needs to be updated
Создание свободных конфигураций битов
Теперь, когда наши источники журнала,Nginx AccessиошибкаЖурналы готовы, нам нужно настроить бегство на:
- ХАЙТЕ ФАЙЛА ЖУРНАЯ, мы установили от NGINX.
- Примените соответствующий анализатор в зависимости от типа журнала.
- Отправьте структурированные события в API OpenObserve HTTP.
Мы создадим два файла конфигурации:config/fluent-bit.confиconfig/parsers.confПолем
1. Созданиеparsers.conf
Мы начнем с nginxЖурнал доступаформат. Вот настоящий пример:
172.19.0.1 - - [11/Aug/2025:19:46:57 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:141.0) Gecko/20100101 Firefox/141.0" "-"
Наша цель - разбить этот единственный вход в журнал на структурированные поля:
Поле | Извлеченное значение |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Для этого мы определим анализатор на основе корпорации вparsers.confЭто соответствует формату журнала и назначает каждую захваченную группу значимое имя. Эти имена поля облегчат запрос и визуализировать данные в OpenBeserve.
Мы также добавим второй анализатор для обработки журналов ошибок NGINX.
Вотconfig/parsers.conf:
[PARSER]
Name nginx
Format regex
Regex ^(?<client_ip>\S+) (?<ident>\S+) (?<user>\S+) \[(?<time>[^\]]+)\] "(?<method>\S+) (?<path>[^"]*?) (?<protocol>HTTP\/[^"]+)" (?<status>\d{3}) (?<size>\d+|-) "(?<referer>[^\"]*)" "(?<agent>[^\"]*)
Time_Key time
Time_Format %d/%b/%Y:%H:%M:%S %z
Time_Keep On
[PARSER]
Name nginx_error
Format regex
Regex ^(?<time>[0-9]{4}/[0-9]{2}/[0-9]{2} [0-9:]+) \[error\] \d+#\d+: \*\d+ (?<message>.*?), client: (?<client_ip>[^,]+), server: (?<server>[^,]+), request: "(?<method>\S+) (?<path>\S+) (?<protocol>[^"]+)", host: "(?<host>[^"]+)", referrer: "(?<referer>[^"]+)"
Time_Key time
Time_Format %Y/%m/%d %H:%M:%S
Time_Keep On
2. Созданиеfluent-bit.conf
С помощью нашего файла анализатора считывается для преобразования журналов и ошибок в структурный формат, мы можем настроить беглую биту, чтобы заверить журналы доступа и ошибок NGINX, события тегов и отправить их в OpenObServe.
Нашconfig/fluent-bit.confУстанавливает два входа хвоста для установленных файлов журнала, применяет правильный анализатор для каждого, обогащает их метаданными (например,,log_typeиstage) и выводит структурированный JSON в конечную точку проглатывания HTTP OpenObServe.
[SERVICE]
flush 1
daemon Off
log_level info
parsers_file parsers.conf
plugins_file plugins.conf
storage.metrics on
Mem_Buf_Limit 10MB
Skip_Long_Lines On
[INPUT]
Name tail
Path /var/log/host/nginx.access.log
Tag nginx.access
Parser nginx
DB /fluentbit-db/nginx-access.db
[INPUT]
Name tail
Path /var/log/host/nginx.error.log
Tag nginx.error
Parser nginx_error
DB /fluentbit-db/nginx-error.db
[FILTER]
Name modify
Match nginx*
Rename time @timestamp
[FILTER]
Name modify
Match nginx.access
Add log_type access
[FILTER]
Name modify
Match nginx.error
Add log_type error
[FILTER]
Name modify
Match *
Add stage production
[OUTPUT]
Name http
Match nginx.*
URI /api/default/nginx/_json
Host openobserve
Port 5080
tls Off
Format json
Json_date_key @timestamp
Json_date_format iso8601
HTTP_User ${OPENOBSERVE_API_USERNAME}
HTTP_Passwd ${OPENOBSERVE_API_PASSWORD}
compress gzip
Эта конфигурация свободного бита имеет четыре раздела:
[SERVICE]→ Устанавливает глобальные параметры, такие как размер буфера, уровень ведения журнала, файлы анализатора и обработка длинных линий.[INPUT]→ Tails Nginx Access и журналы ошибок, тегит их и применяет правильный анализатор.[FILTER]→ переименоватьtimeполе к@timestamp, добавляетlog_typeна основе источника и наборовstageкproductionПолем[OUTPUT]→ Отправляет обработанные журналы в формате JSON в OpenObServe через HTTP с аутентификацией и сжатием GZIP.
Конфигурация бега с улучшениями LUA
Благодаря настройке битов Fluent мы настроили хвостовые входные данные как для журналов доступа, так и для журналов ошибок, применения соответствующих анализаторов, помеченных и обогащенных событий с метаданными и отправили все в OpenBeserve в формате JSON. Реальным примером будет то, чтобы сделать временные метки, согласованные в этих журналах (поскольку в журналах доступа и ошибок NGINX используются разные форматы).
Сценарий Lua может нормализовать временные метки наISO 8601Прежде чем пересылать их. Этот пример сценария Lua, названныйnormalize_time.lua, доступен в репозитории GitHub:
Просмотреть скрипт LUA LUA LUA
Чтобы использовать его, добавьте фильтр LUA в вашу конфигурацию бегемого бита:
[FILTER]
Name lua
Match *
script scripts/normalize_time.lua
call normalize_timestamp
Полный рабочий пример
Если вы хотите увидеть полную, готовую реализацию всего, что рассматривается в этой статье, включая Nginx, Fluent Bit, OpenObserve Setup, Sangersers, сценарий нормализации TimeStamp Lua и служба Logrotate для автоматического очистки журналов на основе ваших требований, поэтому они никогда не вытекают из-за контроля, вы можете проверить Github Repository:
https://github.com/bilalmughal/nginx-fluentbit-openobserve-stack
Не стесняйтесь исследовать, адаптировать и использовать его в своих собственных проектах.


Последние мысли
С настройкой в этой статье вы можете транслировать, анализировать, нормализовать и визуализировать журналы Nginx в реальном времени, используя бегство и OpenBeserve. Для производственных сред, убедитесь, что вы надежно обращаетесь с чувствительными учетными данными. Например:
- На AWS используйтеAWS Secrets Manager
- На GCP используйтеСекретный менеджер
- На лазуре используйтеКлючевое хранилище
Избегайте хранения клавиш или паролей API непосредственно в файлах конфигурации.
Объединяя надлежащий анализ, нормализацию и безопасное управление учетными данными, у вас будет надежный, масштабируемый и безопасный трубопровод для ведения журнала, готовый для реальных рабочих нагрузок.
Больше от автора
- AWS Deep Learning Amis сэкономит вам время?Контрпродуктивный подход, препятствующий вашему прогрессу!Узнайте о проблемах и решении вКак твоя глубокое обучение Ами сдерживает тебя
- Экономически эффективное создание глубокого обучения развертыванию AMIS с точечными экземплярами:Навигационная параллельная граница!Прочитайте полную статью по адресу:Глубокое обучение на AWS Graviton2, работающее на NVIDIA Tensor T4G
- FIN-Tune FFMPEG для оптимальной производительности с подробным руководством по компиляции:Оптимизируйте свой мультимедийный бэкэнд для оптимальной производительности!Полем Комплексное руководство доступно наПортной ffmpeg для ваших нуждПолем
- Ускорение графического процессора для FFMPEG:Пошаговое руководство с графическим процессором NVIDIA на AWS!Проверьте полное руководство вВключить ускорение Harware с FFMPEG
- ЦП против графического процессора для видео транскодирования на AWS:Разработка мифа процессора-GPU!УвидимсяБросая вызов мифу с затратами на видео
- Создание команды для устойчивого успеха:Являются ли «Rockstars» лучшим решением для процветающей команды?Изучите пониманиеЗа пределами Rockstars
- Как «строители» преобразуют производительность команды:Навигация на видение и идеи к реальности!Узнать больше о строителях вСоединение снов и реальность
- Психическое благополучие в технологии:Создание более здорового рабочего места для технических специалистов.Изучите понимание:Темная сторона высокотехнологичного успеха!
- Фрилансер на полный рабочий день:Понимание корпоративного нежелания. Откройте для себя пониманиеПочему предприятия не решаются нанимать фрилансеров
- Переход от фрилансера на полный рабочий день:Бержа, чтобы преодолеть!ПроверитьПочему предприятия не решаются нанимать фрилансеров
- Масштабирование облака:Откройте для себя лучшую стратегию масштабирования для вашей облачной инфраструктуры вСтратегии вертикального и горизонтального масштабирования
- Будущее эффективного развития бэкэнд:Эффективное развитие бэкэнд с Overbase!Откройте для себя детали вСоздание надежного бэкэнда с Overbase