Пошаговое путешествие от коллекции журналов до визуализации

Вы не можете исправить то, что вы не знаете. Вот почему мы регистрируем события, чтобы получить четкое представление о том, что происходит в вашей системе, даже когда вы не смотрите. Журналы - один из лучших способов, а иногда и единственный вариант, чтобы выявить и исправить проблемы.

Как правило, приложения издают так много данных в живой среде, которая извлечения значимой информации из большого набора данных может быть исчерпывающим, особенно когда производственный технический стек запускает несколько типов приложений, каждый из которых выводит данные в своем собственном формате и часто разбросанный по системам. Вещи становятся все сложнее для разработчиков или инженеров DevOps, которые не являются опытными в инструментах текстовой обработки UnixgrepВsedВawkи т. д. Определение проблемы - это только первый шаг, и в производстве время никогда не на вашей стороне. В эти моменты мы все хотим, чтобы мы могли визуализировать все и мгновенно увидеть всю картину, а не просеивать бесконечные строки необработанных журналов и столбцов.

Управление или внедрение такой системы не является знакомым подвигом. Управляемые решения стоят денег или требуют от вас отправки данных за пределами вашей инфраструктуры, и не всегда легко оправдать большие деньги или компромиссы безопасности для чего-то, что не является прямым источником дохода. Есть так много вариантов, но они либо дороги, либо не хватает.

Попробовав множество комбинаций, я наконец нашел Святой Грааль для инфраструктуры регистрации:БеглыйиOpenBserveПолем Оба эти проекта являются открытым исходным кодом, имеют бесплатные версии, активно поддерживаются, могут легко самостоятельно самостоятельно и отлично работать в тандеме.

В этом руководстве мы создадим полный трубопровод для ведения журнала, от необработанных журналов Nginx до проглатывания и визуализации, используя Docker Compose для настройкиБеглыйиOpenBserveшаг за шагом. В конце концов, у вас будет полностью функциональная, сквозная система регистрации, которая может работать локально для разработки или адаптироваться для производственных сред.

Обзор архитектуры

Nginx записывает свои журналы доступа и ошибок на диск, где беглый бит поднимает их, обрабатывает их в соответствии с нашими требованиями и отправляет их в OpenBeserve через HTTP Ingestion. Logrotate автоматически обрабатывает вращение файлов журнала, предотвращая неконтролируемый рост и архивируя старые данные в соответствии с определенной политикой удержания.

OpenObserve сохраняет журналы, которые вставлены в магазин PostgreSQL Metadata, и делает их доступными для поиска и визуализации через его веб -интерфейс, как показано на диаграмме.

Architecture Overview

Настройка контейнеров 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параметр -скопировать его значениеПолем Нам понадобится этот пароль на следующем шаге.

OpenObserve - Data Sources Dashboard

Настройка контейнера бегемого бита

На этом этапе у нас есть 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иошибкаЖурналы готовы, нам нужно настроить бегство на:

  1. ХАЙТЕ ФАЙЛА ЖУРНАЯ, мы установили от NGINX.
  2. Примените соответствующий анализатор в зависимости от типа журнала.
  3. Отправьте структурированные события в 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" "-"

Наша цель - разбить этот единственный вход в журнал на структурированные поля:

Поле

Извлеченное значение

client_ip

172.19.0.1

ident

-

user

-

time

11/Aug/2025:19:46:57 +0000

method

GET

path

/

protocol

HTTP/1.1

status

304

size

0

referer

-

agent

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

Не стесняйтесь исследовать, адаптировать и использовать его в своих собственных проектах.

OpenObserve - Logs view

OpenObserve - Log Visualization

Последние мысли

С настройкой в этой статье вы можете транслировать, анализировать, нормализовать и визуализировать журналы 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