Налаштування централізованого логування через Fluentd / Fluent Bit

Логи розкидані по серверах, і пошук причини збою перетворюється на години ручної роботи. Ми налаштовуємо централізований збір і зберігання логів на Fluentd під ключ, з маршрутизацією по всіх сервісах. Наші інженери передають готові конфігурації та регламенти, а розбір інциденту займає хвилини замість годин.
Часті запитання

Чому Fluentd втрачає логи під піковим навантаженням

Піковий трафік ламає збір логів не в момент запису, а в момент відправлення. Агент Fluentd на вузлі приймає події від застосунків швидше, ніж встигає віддати їх у сховище, і складає їх у буфер — спочатку в пам'ять, потім на диск.

Коли відведене під чергу місце закінчується, спрацьовує політика переповнення: агент починає відкидати найстаріші блоки. Саме тому логи зникають рівно в той момент, коли триває розбір інциденту і вони потрібні найбільше.

Вузьке місце збору рідко буває одне.

Різні формати логів обробляються різними фільтрами: структурований JSON розбирається швидко, а багаторядкові трасування й нерегулярний потік від веб-сервера потребують регулярних виразів і склеювання за таймаутом — на кожному рядку це коштує процесорного часу. Чим більше рядків за одиницю часу, тим повільніше фільтри й тим швидше зростає черга.

Під час розбору інциденту картина повторюється: черга на вузлі зросла до межі за лічені хвилини, інтервал скидання буфера не встигає її розвантажувати, дискове сховище черги переповнене.

Частина подій дійшла до центрального сховища, частина залишилася в блоках, які вже видалені під час ротації. Відновити хронологію за обрізаними даними неможливо — зникла саме межа збою.

Розбираємо, як це закривається: рахуємо реальну пропускну здатність агента на вузлі, задаємо буферизацію із запасом по диску, обираємо політику переповнення, яка зберігає свіжі події, і приводимо різні формати логів до єдиної схеми до відправлення.

Що дає централізований збір логів і де виграш

Коли логи лежать на кожному вузлі окремо, розбір інциденту починається з обходу машин, а не з гіпотези.

Інженер звіряє хости, часові пояси й версії, втрачає контекст між контейнерами одного запиту — час пошуку за логами зростає разом із кількістю вузлів, а вартість простою рахують, поки діагнозу ще немає.

Централізоване логування знімає цей етап. Агент Fluentd збирає вивід контейнерів і системні журнали, склеює багаторядкові повідомлення в одну подію, додає метадані — вузол, сервіс, оточення — і розкладає потоки за тегами, щоб шум застосунку не змішувався з журналом ядра.

Буфер на диску переживає недоступність приймача: під час обриву зв'язку агент пригальмовує читання й доставляє накопичене пізніше, а не втрачає записи.

Далі виграш стає вимірюваним. Пошук за логами перетворюється на один запит за метаданими, розбір інциденту — на перегляд ланцюжка подій одного запиту за ідентифікатором кореляції.

Частка відновлених подій зростає: нічого не зрізається на етапі збору, тому картину збирають навіть за збоями, які раніше списували на «немає даних».

Змінюється й клас відмов. Зникає сценарій «збій помітили, причину не знайшли» — залишаються записи з точним часом, вузлом і версією збірки.

Термін зберігання задається політикою за тегами: об'ємні технічні повідомлення йдуть у холодне сховище, а помилки й події доступу залишаються під рукою довше.

Режими роботи Fluentd: агент на вузлі, служба, шлюз

Fluentd — це не лише агент на кожному вузлі. Той самий збирач розгортають у трьох режимах, і вибір визначає, де накопичується буфер, скільки ресурсів витрачає застосунок і що станеться під час обриву каналу до приймача. Нижче — варіанти, між якими реально обирають.

Варіант Коли підходить Обмеження
Агент на вузлі Застосунок пише у файл, джерело одне, важливе мінімальне навантаження на сервіс Немає спільної точки агрегації: правила розмазані по хостах, під час шторму логів буфер зростає поруч із робочим процесом
Служба на виділеному вузлі Кілька сервісів на хості, потрібен єдиний конфіг і розбір форматів Вузол стає точкою відмови, потрібні резерв і жорсткі ліміти за пам'яттю
Шлюз збору Багато джерел, неоднорідні формати, потрібні маршрутизація й збагачення З'являється проміжна ланка в шляху, шлюз треба масштабувати й захищати від втрати буфера

Режим буферизації підбирається під вимоги до відмовостійкості збору. Буфер у пам'яті дає максимальну швидкість, але втрачається під час перезапуску процесу; буфер на диску з обмеженням за розміром і кількістю чанків переживає падіння агента й розрив зв'язку з приймачем.

Схема «легкий агент на вузлі плюс шлюз збору з дисковим буфером» розвантажує застосунки: мережу й повторні відправлення бере на себе шлюз, а не сам сервіс.

Етапи впровадження централізованого логування

Порядок робіт будується так, щоб кожен крок спирався на дані попереднього.

Починаємо не зі встановлення агентів, а з інвентаризації: поки невідомо, скільки джерел і в яких вони форматах, маршрутизація перетворюється на вгадування й виринає втраченими записами під час першого ж розбору інциденту.

  1. Інвентаризація джерел. Перелік сервісів, файлів, системних журналів і контейнерів: формат запису (структурований JSON, неструктурований текст, багаторядкові трасування), швидкість зростання, власник. На виході — таблиця з черговістю підключення: кого беремо в першій хвилі, кого свідомо відкладаємо.

  2. Схема потоків. Маршрут «агент на вузлі → агрегатор → сховище», з буферизацією на диску й заданою поведінкою за недоступності приймача. Теги й мітки (сервіс, оточення, вузол) фіксуємо заздалегідь — за ними потім будуються вибірки й алерти.

  3. Налаштування збору й розбору. Конфігурації Fluentd — парсери, фільтри, розміри буферів, повтори за помилок — тримаємо в репозиторії й змінюємо через рев'ю, а не правкою на сервері.

  4. Пілотна група. Три-п'ять сервісів із різними форматами логів. Перевіряємо втрати під час обриву мережі, навантаження від агента на вузол і коректність розбору багаторядкових записів.

  5. Перевірка повноти логів. Звіряємо кількість записів на джерелі й у сховищі, шукаємо пропуски на піках навантаження. Критерій приймання — розходження в заданих межах, а не «наче все надходить».

  6. Передавання в експлуатацію. Інструкції щодо типових збоїв, оповіщення на відставання доставки й переповнення буфера, регламент підключення нового джерела — щоб сервіси додавалися без нашої участі.

Що замовник отримує: конфігурації Fluentd і регламенти

Робота закінчується не запущеним сервісом, а комплектом артефактів, який ваша команда супроводжує своїми силами.

Кожен пункт передаємо у вигляді, придатному для правок без нас: конфігурації лежать у репозиторії, рішення щодо маршрутизації описані словами, а не лише в голові інженера.

  • Конфігурації збору — описи джерел, фільтрів розбору й маршрутів виводу єдиним набором файлів у репозиторії. Зміни проходять перевірку на тестовому контурі: збирач піднімається з новим набором, проганяє еталонні події й лише потім іде в робочий контур.
  • Схеми потоків — звідки й куди йде кожен тип подій, де стоїть буфер на диск, де події збагачуються, а де відкидаються як дублі. Схема дозволяє за хвилину зрозуміти, чому запис із конкретного сервісу не дійшов до сховища.
  • Політики доступу — які команди бачать які набори логів, які поля маскуються до запису, як видаються й відкликаються токени збирачів. Окремо фіксуємо, що робити під час звільнення співробітника або зміни підрядника.
  • Правила зберігання й очищення — скільки живуть події у швидкому доступі, що йде в архів, за яким віком видаляється решта. Сховище перестає зростати безконтрольно, при цьому вікно для розбору інциденту залишається достатнім.
  • Регламент чергування — кому й у який канал надходить сигнал у разі відмови збирача або втрати потоку, за який час потрібна реакція, що вважається інцидентом, а що штатною деградацією.
  • Метрики самого конвеєра — затримка доставки, заповнення буфера, частка відкинутих записів. За ними видно проблему до того, як про неї повідомить розробка.
  • Документація — покрокові інструкції «як підключити нове джерело» й «як розібрати типові відмови», із прикладами готових блоків конфігурації.

Приймання проводимо на живому сценарії: гасимо один вузол збору й перевіряємо, що події не втрачаються, а після відновлення доїжджають цілком.

Кейс: розбір інциденту за логами замість годин пошуку

До: логи були, а картини інциденту не було

Сервіс працював на десятку вузлів, і кожен писав у локальний файл із ротацією за розміром.

Під час збою інженер йшов по машинах через термінал, зіставляв відмітки часу вручну — і все одно не бачив ланцюжок цілком: частина подій губилася під час ротації, частина залишалася на вузлі, який на момент розбору вже вивели з балансування.

Повнота логів трималася близько 60%, пошук потрібної події займав 40-60 хвилин, відновлення сервісу розтягувалося на години.

Що змінили

Зібрали єдиний контур: Fluentd на агрегації та легкий агент на вузлах із дисковим буфером, який переживає обрив зв'язку, перезапуск агента й перезавантаження машини.

Кожен запис розмітили метаданими — сервіс, середовище, версія релізу, ідентифікатор запиту — і привели до єдиного формату на вході, тому пошук іде за полями, а не за текстом.

Політику зберігання прив'язали до цінності даних: часті технічні події живуть дні, помилки й сліди змін — місяцями.

Після: інцидент розбирається за одним запитом

Повнота логів зросла до 99%: втрати на ротації й обривах зв'язку зникли, а пропуски відправлення агент досилає з буфера після відновлення каналу.

Пошук події займає 2-3 хвилини замість години, час відновлення сервісу скоротився приблизно вчетверо — черговий бачить послідовність від першого збою до каскаду, а не збирає її за фрагментами.

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

На тому самому контурі пізніше підключили метрики й трасування — точки відмови тепер зіставляються з логами за спільними метаданими, і розбір не починається заново для кожного нового інструмента.

Чим Fluentd відрізняється від Fluent Bit і що вибрати

Це не два конкуруючі продукти, а два рівні однієї схеми збору. Fluent Bit ставлять на кожен вузол як легкий агент: він читає stdout контейнерів і файли журналів, додає метадані (ім'я пода, namespace, мітки) і відправляє далі.

Fluentd займає місце центрального агрегатора, де потрібні повноцінна маршрутизація, фільтрація й роздача в кілька приймачів.

Різниця видна в споживанні ресурсів. Fluent Bit — один статично зібраний виконуваний файл без зовнішніх залежностей, тому десятки вузлів не дають помітного навантаження й агент не конкурує з робочими сервісами за пам'ять.

Fluentd — середовище з великим набором плагінів і гнучкими буферами на диску, він вимогливіший і розгортається там, де ресурсів явно достатньо.

Варіант Коли підходить Обмеження
Fluent Bit на кожному вузлі Збір логів контейнерів і файлів, мінімум навантаження на вузлі Проста маршрутизація, складні перетворення незручні
Fluentd як агрегатор Централізована обробка, фільтри, доставка в кілька сховищ Вимогливий до пам'яті, не місце на кожному вузлі
Fluent Bit → Fluentd Кластери з десятками вузлів: економія на вузлах плюс складна логіка Більше ланок: стежити за буферами й повторами під час збоїв

Практичний критерій простий. Якщо завдання — доставити логи з вузла без втрат і без зростання споживання, достатньо Fluent Bit із налаштуванням дискового буфера й повторів за недоступності приймача.

Якщо з'являються розгалуження потоків за мітками, маскування полів, дедуплікація, склеювання багаторядкових записів і роздача в кілька систем одночасно — це робота для Fluentd.

Змішана схема закриває обидві вимоги: на вузлах залишається дешевий агент, а вся логіка переїжджає на шар агрегації. Тоді зміна маршрутизації не потребує перезапуску агентів на кожній машині, а буфери на двох рівнях згладжують недоступність сховища.

Далі розбираємо, як ця схема налаштовується й які параметри буферів визначають, чи втратяться записи під час перезапуску вузла.

Технічні сумніви перед впровадженням логування

На етапі оцінки майже завжди виринає той самий набір сумнівів: застосунки пишуть логи по-різному, у рядках опиняються персональні дані, незрозуміло, скільки все це зберігати й чи не почне збір гальмувати робочі сервіси. Нижче — як ми закриваємо кожен із них конфігурацією, а не обіцянками.

А якщо в нас десятки сервісів із різними форматами логів?

Агент ставиться поруч із застосунком і приводить потік до структурованого вигляду: для кожного джерела описується своє правило розбору, а неструктурований текст зберігається як є з мітками контейнера й пода.

На виході — єдина схема полів, тому пошук, оповіщення й дашборди працюють однаково для всіх сервісів, а не переписуються під кожен.

Як бути з персональними даними в логах?

Маскування виконується на стороні агента, до відправлення: фільтри вирізають значення за іменами полів і шаблонами, усе інше відсікається за білим списком.

У сховище потрапляє вже знеособлений потік, тому термін зберігання перестає залежати від вимог до захисту персональних даних.

Скільки зберігати й чи не зросте реєстр нескінченно?

Політика задається за класом даних: свіжі логи лежать у швидкому сховищі, потім автоматично переїжджають у дешевий архів і видаляються за розкладом.

Для прикладних логів і журналів доступу терміни різні — реєстр не зростає нескінченно, при цьому вікно для розбору інциденту залишається достатнім.

Чи не сповільнить логування робочі сервіси й як запускати поетапно?

Агент працює окремим процесом, пише буфер на диск і обмежений за процесором і пам'яттю. Якщо приймач недоступний, буфер переживає перезапуск, а застосунок продовжує відповідати — збір логів не потрапляє в критичний шлях запиту.

Стартуємо з пілотного контуру: звіряємо повноту й втрати на одній групі сервісів, потім розкочуємо на решту, з можливістю відкотити конфігурацію на агенті.

Обговоримо ваше завдання з логування

Щоб оцінка була предметною, а не «на око», достатньо кількох вступних: які джерела пишуть логи (застосунки, системні служби, контейнери, балансувальники), приклади реальних записів за годину-дві й поточний шлях цих записів — куди вони йдуть і в якому обсязі.

За рядками відразу видно, де потрібен розбір і збагачення полів, а де достатньо доставки, і це змінює і конфігурацію, і терміни.

Далі розбираємо схему цілком: агенти на вузлах або набір демонів у кластері, буферизація на диск за недоступності приймача, мітки й маршрутизація в кілька сховищ, обмеження зростання індексів.

Після розбору повертаємося з планом, оцінкою термінів і складом робіт — без абстрактних формулювань.

Що входить у розбір і що ви отримуєте на виході:

  • Перелік джерел і розмітку: які поля витягуємо з рядків, що залишаємо в початковому вигляді.
  • Схему доставки: де стоять агенти, як налаштовані черги, що відбувається під час обриву зв'язку з приймачем.
  • План впровадження за етапами: пілот на одному контурі, перевірка повноти й втрат, потім розкочування на решту.
  • Оцінку термінів і трудовитрат за кожним етапом із точками контролю й ознаками готовності.
  • Конфігурації Fluentd, схему потоків і правила зберігання — з розрахунком, як швидко зростає обсяг.
  • Регламент підтримки після запуску: реакція на збої доставки, оновлення конфігурацій, чергування.
  • Інструкції для вашої команди: як додати нове джерело й не зламати розбір наявних.

Опишіть завдання в тому обсязі, який є на руках, — повернемося з планом впровадження, оцінкою термінів і зрозумілою зоною відповідальності після запуску.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139