
Улучшить системное понимание: создайте свой собственный конвейер для визуализации журнала.
20 августа 2025 г.Пошаговое путешествие от коллекции журналов до визуализации
Вы не можете исправить то, что вы не знаете. Вот почему мы регистрируем события, чтобы получить четкое представление о том, что происходит в вашей системе, даже когда вы не смотрите. Журналы - один из лучших способов, а иногда и единственный вариант, чтобы выявить и исправить проблемы.
Как правило, приложения издают так много данных в живой среде, которая извлечения значимой информации из большого набора данных может быть исчерпывающим, особенно когда производственный технический стек запускает несколько типов приложений, каждый из которых выводит данные в своем собственном формате и часто разбросанный по системам. Вещи становятся все сложнее для разработчиков или инженеров 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
Оригинал