Улучшить системное понимание: создайте свой собственный конвейер для визуализации журнала.

Улучшить системное понимание: создайте свой собственный конвейер для визуализации журнала.

20 августа 2025 г.

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

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

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


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE