Налаштування централізованого логування через Loki + Grafana під ключ

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

Централізоване логування: де ламається розрізнений збір логів

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

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

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

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

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

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

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

Що дає єдина точка збору й пошуку по всіх сервісах

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

Єдина точка збору логів на Grafana Loki прибирає цей етап — записи з усіх сервісів лягають в одне сховище зі спільними мітками сервісу, середовища та версії збірки.

Наскрізний пошук по журналах замість перебору вузлів

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

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

Повнота картини по всьому ланцюжку запиту

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

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

Термін зберігання журналів і спостережуваність сервісів

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

Способи доставки логів: агент, приймач, сервісний шлюз

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

Варіант Коли підходить Обмеження
Агент на вузлі — збір логів агентом журнали пишуться у файл або системний журнал, код міняти не можна накладні витрати на збір на кожному вузлі; без диска-буфера втрачає хвіст, коли приймач недоступний
Мережевий приймач журналів мережеві пристрої та старі сервіси, які вміють лише надсилати мережею немає підтвердження доставки при обриві каналу, структура урізана до одного рядка
Сервісний шлюз поруч із застосунком контейнери, багато короткоживучих процесів, виведення в потік ускладнює розгортання, у шлюзу свій життєвий цикл і оновлення
Пряма доставка із застосунку потрібні точні поля, розмітка запиту, зв'язка з трасуванням доопрацювання застосунку та прив'язка до бібліотеки; збій каналу обвалює буфер у пам'яті

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

Порядок впровадження: від інвентаризації джерел до передачі

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

  1. Інвентаризація джерел логів — обходимо сервіси, вузли та застосунки, фіксуємо формат записів, добовий обсяг і власника. За цією таблицею рахуємо навантаження на сховище та термін зберігання.
  2. Схема потоків журналів — де стоїть збирач, як записи потрапляють у сховище, які мітки (сервіс, середовище, рівень) використовуються. Мітки добираємо так, щоб кардинальність залишалася передбачуваною.
  3. Розгортання — Loki і Grafana, гарячий шар на дисках і довготривалий в об'єктному сховищі. Lifecycle-правило тримає останні дні у швидкому доступі, решту веде в холодний шар.
  4. Доступ і розмежування — ролі в Grafana та окремі джерела даних під команди: розробник бачить свої сервіси й не читає чужі.
  5. Перевірка на реальному навантаженні — відтворюємо піковий потік, заміряємо затримку від запису до появи в пошуку, дивимося поведінку при відмові збирача та переповненні диска.
  6. Алерти та дашборди — правила на LogQL для помилок і сплесків, маршрутизація повідомлень черговому.
  7. Передача інфраструктури замовнику — конфігурація в репозиторії, регламенти експлуатації, навчання команди на живому стенді.

Що залишається у вас після здачі: конфігурації та регламенти

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

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

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

Кейс: як скоротили розбір інциденту з годин до хвилин

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

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

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

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

Що змінилося в роботі з інцидентом

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

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

Час локалізації причини збою скоротився з годин до 10–15 хвилин — у середньому в 12 разів за зафіксованими інцидентами. Окремо закрили клас відмов, про які раніше дізнавалися лише від користувачів: розсинхрон із зовнішніми системами та збої фонових завдань. Тепер за ними спрацьовує повідомлення, і черговий бачить проблему раніше, ніж клієнт її помітить.

Чим централізоване логування відрізняється від збору логів

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

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

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

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

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

Критерій Файли в одному місці Централізоване логування
Пошук обхід хостів вручну запит за мітками, одна видача
Доступ спільний доступ до сервера ролі за джерелами й контурами
Зберігання зростає, поки вистачає диска політики за джерелом і терміном
Структура нерозібраний текст поля, мітки, ідентифікатор запиту

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

Технічні сумніви: обсяги, зберігання, доступи

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

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

Як швидко зростає обсяг записів і чим він обмежений?

Обсяг зростає разом із кількістю сервісів і трафіком. Обмежуємо на вході: відкидаємо шум — перевірки живучості, повторювані помилки, — задаємо квоти на застосунок і проріджування при перевищенні. Зростання стає передбачуваним, а не «поки не скінчиться диск».

Що станеться, якщо приймач недоступний?

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

Як розмежовується доступ до записів?

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

Скільки зберігаються записи і як вони видаляються?

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

Обговоримо задачу: що підготувати до першої розмови

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

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

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

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

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

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

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