Pull to refresh

Comments 25

filebeat умеет парсить логи из докер-контейнеров «из коробки». Причём для nginx есть специальный модуль:

filebeat.autodiscover:
  providers:
  - type: docker
    templates:
      - condition:
          contains:
            docker.container.name: "vhost-"
        config:
          - module: nginx
            access:
              input:
                type: container
                paths:
                  - /var/lib/docker/containers/${data.docker.container.id}/*.log
                stream: stdout
            error:
              input:
                type: container
                paths:
                  - /var/lib/docker/containers/${data.docker.container.id}/*.log
                stream: stderr


В связи с этим возникает вопрос: в чём преимущество Fluent-bit в данном случае?

Ещё одна проблема вот в этой строчке:
access_log /var/log/nginx/access.log

Эта строчка означает, что логи nginx пишутся в файл, который внутри контейнера. То есть в логи самого контейнера ничего не поподёт, и fluentD никаких логов не получит.

Правильный конфиг nginx в докере — писать в stdout, который уходит в логи контейнера:
access_log /dev/stdout

В связи с этим возникает вопрос: в чём преимущество Fluent-bit в данном случае?

Nginx взят в качестве примера, может быть не совсем удачного и сбивающего с толку.
На мой взгляд у filebeat особых преимуществ перед Fluent-bit не дает)
Эта строчка означает, что логи nginx пишутся в файл, который внутри контейнера. То есть в логи самого контейнера ничего не поподёт, и fluentD никаких логов не получит.

Пройдите туториал, все работает как надо)
Спасибо за обратную связь)
Насколько помню, стандартный образ nginx создаёт симлинки с этих файлов на stdout и stderr. Поэтому оно и работает
Очень не хватает в файлбите aws s3 output

возьмите fluentd.
Конечно, filebeat больше аналог fluent-bit, а флюентди скорее аналог логстэша...

от флуентд я отказался по ряду причин. Отжирание памяти, зависания, постоянные перегрузки по io и превышения лимита inodes при интенсивной работе дискового кэша ( пришлось держать кэш в памяти), проблема с метриками — не обнуляется счетчик failed retries после реконнекта с эластиком, требуется рестарт процесса, нужен держать два отдельных репозитория (elastic и fluentd) и японские разработчики с особенностями национальной разработки.

issues заведены? beat'ы от Elasticsearch тоже далеко не идеальны

issues у них полно на эту тему, мне лично разраб ответил что wantfix
плюс только у файлбит есть модуль для парсинга логов циско аса, который мы используем

здесь вопрос в том на какой стороне вы хотите делать процессинг. Те же Filebeat подсаживают специальную конфигурацию в ингест ноду эластика (если это вообще возможно, а не стоит кафка посередине) и поэтому зачастую в конфигурации Filebeat + ES парсингом занимается ES :-o :-o :-o


А если уж говорить серьезно, то можно взять рсислог — беспроблемное решение из 00-х. Он уже давно стандартный лог шиппер во многих дистрибутивах и есть готовый солюшен для циски
https://www.rsyslog.com/normalizing-cisco-asa-messages/

у нас рсислог локально с машин логи отылает на прокси сервер с файлбитом, файлбит передает на логстэш (тк только логстэш умеет s3 output) логстеш отсылает в эластик и копию в с3 бакет.

тема модулей у filebeat всего не решает.
я вот никак не могу решить проблему "фильтрации" сбора логов от определённых контейнеров - по-прежнему забираю логи от всех контейнеров на хосте и уже в фильтрами grok и в kibana выискиваю нужные.
поднял вопрос вот здесь- https://discuss.elastic.co/t/filtering-setup-for-docker-containers-not-working/295573 , но пока не знаю куда дальше двигаться. Очень смутно представляю, может ли это fluent*.

по пути /var/log/nginx/access.log находится симлинк в /dev/stdout

Спасибо! С виду очень интересно. Есть ли у Вас опыт использования?
Более года в разных проектах. Очень стабилен и нетребователен к ресурсам. Никаких утечек памяти, возможно rust сыграл немалую роль в этом

Утечек может и нет, но rust не даёт гарантий отсутствия гонок или дедлоков, к сожалению

И не должен. Но разговор не о rust

Щупал fluent-bit последние пару недель, синтаксис легкий, добавление парсеров, исключения, все понятно, но остался очень негативный осадок, а именно встретились следующие проблемы:
— Утечка памяти (спокойно сожрало > 30G RAM)
— Переподключение к OUTPUT может повиснуть, что к forward, что к эластику
— Иногда в момент проблемы с переподключением его можно остановить лишь при помощи kill -9

На данный момент у fluent-bit очень много проблем, достаточно глянуть на количество issue в github.

30ГБ? Может это виртпамять была, а не реальная?

Сервер сожрал swap и заставил работать OOM Killer.

Мне не нравится использование кастомного log driver. Поясню. Есть всего два драйвера, которые не нарушают работу docker logs команды, которая удобна для отладки и локальной разработки — это json-file и journald. Первый — «по умолчанию». Второй мне нравится больше, но интеграция с ним флюента будет сложнее. Касательно настроек для filebeat & json-file SlavikF уже подсказал


Что мне ещё не понравилось — какой-то странный конфиг nginx — зачем мы пишем логи в файл, а потом в stdout? А потом мучаемся, чтобы отделить реальные сообщения об ошибках от логов доступа? Зачем зря процессор грузить? Тут не хватает двух замечаний:


  1. В дефолтном nginx с докерхаба сделано перенаправление файла лога в stdout/stderr, но это «магия» и нельзя уповать на то, что это будет так в любом приложении и в любом образе
  2. А чего сразу потоки из приложения сразу не категоризировать сразу?
как писал выше, nginx здесь только для примера, приведенный конфиг это стандартный конфиг контейнера, просто я упростил формат логов.

С вашими замечаниями согласен, мне наверное стоило в начале написать, что этот туториал о том как можно работать с логами с помощью fluent-bit, а не реальный, готовый для продакшена парсинг логов Nginx)
Я бы не рекомендовал имплементировать данную архитектуру.
Поясню почему:
Использование парсеров данных в контейнере — это ужас ужасный. REGEX — одна из самых дорогих операций в програмировании, т.е. проц будет жрать, как не в себя. А теперь представьте сайт, или микросервис, у которого вдруг пошёл спайк логов, а такое бывает. Мало того, что он сам перегружает проц, так ещё и флуент на себя тянет… результат- упал контейнерь и логи ушли, т.к. были внутри контейнера. Далее, для более ли менее приличного колличества контейнеров, пойдёт нереальный перегруз по соединениям с Эластиком при малом размере балка. Эластик это очень не любит. Как потенциальный результат — входная очередь в Эластике переполнилась и агенты получают эксепшены. Я не помню есть ли там апарат повторной пересылки, но даже если есть, то это только ещё больше забьёт очередь, а если нет, то потеряете данные. Кроме того, если я правильно понял, у Флюента нет внутреннего лод балансера на посылку в Эластик, т.е. там можно определить только один нод, а это значит, что если нод упал, данных нет. Ну и по мелочам, типа поддержки ECS, увеличенного трафика за счёт полей JSONa и.т.д.
У меня недавно был клиент, который хотел у себя такое имплементировать… слава б-гу отговорил:) В общем категорически не рекомендую.
Если уж вы хотите использовать Флюент (хотя я всё ещё предпочитаю Файлбит), то логи стоит писать на диск, который при падении контейнера не умрёт. Посылать их в том формате, в котором они есть на отдельный контейнер(или несколько) с парсером, а он уже будет кидать их в Эластик. Я обычно ставлю Файлбиты, посылающие на Логсташ и уже он парсит и кидает в Эластик.
И да, совсем не вазноь чьи логи… скажу больше если это кастомнэ логи чьейто аппликации, то писать под них реджексы это тот ещё кайф, уж лучьше гроки:)

Спасибо, нашел важные ответы на свои вопросы в данной статье!

Sign up to leave a comment.

Articles