ServerAdmin.ru
32.4K subscribers
1.17K photos
72 videos
29 files
3.18K links
Авторская информация о системном администрировании.

Информация о рекламе: @srv_admin_reklama_bot
Автор: @zeroxzed

Второй канал: @srv_admin_live
Сайт: serveradmin.ru

Ресурс включён в перечень Роскомнадзора
Download Telegram
Я часто упоминал в различных заметках систему по сбору логов Loki. Например, вот в этой подборке подобных систем (там сразу можете посмотреть аналоги). При этом у меня нет ни одной заметки на тему того, как её быстро развернуть. Решил написать краткое руководство по этой теме.

Проект относительно новый, стартовал в 2018 году в противовес стеку ELK. Grafana решила сделать более простой и легковесный вариант хранения логов немного с другой моделью анализа, без полной индексации текстов логов, используя вместо этого метки для потоков. На деле получился хороший продукт, интегрированный в стек Grafana + Prometheus с похожей идеологией хранения и поиска (язык запросов LogQL по аналогии с PromQL).

Для начала выполню базовые действия для запуска Loki и Grafana и настрою отправку логов в Loki от различных Docker контейнеров. Большее в одну заметку не уместить. Думаю, что далее я эту тему разовью.

Я не буду запускать Loki и Grafana в одном Docker Compose файле, так как им не обязательно быть установленными вместе. Grafana поддерживает весь стек своих продуктов, так что нет особого смысла поднимать её рядом со сборщиком логов.

Сначала запустим Loki. Готовим для него compose.yaml и конфигурацию в config.yaml. Не буду приводить здесь содержимое. Оно будет отправлено следующим сообщением в архиве со всеми остальными конфигурациями. Для удобства скопировал её же в gitflic.

# curl https://get.docker.com | bash -
# git clone https://gitflic.ru/project/serveradmin/grafana-loki.git
# cd grafana-loki/loki/

В файле compose.yaml укажите актуальную версию image на момент установки. Запускаем проект:

# docker compose up -d

Проверим, что сервис стартовал:

# curl http://192.168.137.29:3100
404 page not found

Это нормальный ответ. 404 нам ответил Loki. Запустим теперь Grafana:

# cd ../grafana

Указываем нужную версию в compose.yaml и запускаем:

# docker compose up -d

Идём браузером по IP сервера, где запущена Grafana на порт 3000. Учётка по умолчанию - admin / admin. Заходим в Grafana, идём в раздел ConnectionsData sourcesAdd data source. Выбираем Loki. В качестве настроек достаточно указать только url. В моём случае это http://192.168.137.30:3100/. Мотаем страничку в самый низ и нажимаем Save & Test. Ошибок быть не должно.

Стек поднят и готов к приёму логов. Отправим туда логи контейнеров Docker. Для этого у Docker существует драйвер. Его необходимо установить на хосте:

# docker plugin install grafana/loki-docker-driver:3.6.0-amd64 --alias loki --grant-all-permissions

Проверяем, что он установился:

# docker plugin ls
018395707e37  loki:latest  Loki Logging Driver  true

Всё в порядке. Теперь мы можем в самом демоне Docker настроить отправку всех логов в Loki через правку его конфигурации в /etc/docker/daemon.json. Для этого туда надо добавить:

{
"debug": true,
"log-driver": "loki",
"log-opts": {
"loki-url": "http://192.168.137.30:3100//loki/api/v1/push",
"loki-batch-size": "400"
}
}


Это не очень удобно, если у нас нет желания собирать логи абсолютно всех контейнеров. Удобнее управлять этим для каждого контейнера отдельно. Для этого в compose файл достаточно добавить ещё одну секцию logging. Покажу сразу итоговый пример для запуска Grafana из этой публикации:

services:
 grafana:
  image: docker.io/grafana/grafana-oss:12.3.1
  container_name: grafana
  logging:
   driver: loki
   options:
    loki-url: "http://192.168.137.30:3100/loki/api/v1/push"
    loki-retries: 2
    loki-max-backoff: 800ms
    loki-timeout: 1s
    keep-file: "true"
    mode: "non-blocking"
  ports:
   - "3000:3000"
  volumes:
   - grafana-data:/var/lib/grafana
  restart: unless-stopped
volumes:
 grafana-data:
  driver: local


Перезапускаем проект:

# docker compose stop
# docker compose up -d

Идём в Grafana, раздел DrilldownLogs. Выбираем в выпадающем списке service имя контейнера и смотрим его логи.

Настройка простая и быстрая, легко автоматизируется. Далее я разовью эту тему и добавлю логи из других систем.

———
ServerAdmin: 📱 Telegram | 🌐 Сайт | 📲 MAX

#loki #logs #devops
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍105👎5
Продолжу тему со сбором логов в Loki. Хочу написать законченный цикл заметок, в которых будет показан сбор логов популярных сервисов. В прошлой заметке я установил Loki + Grafana и отправил в Loki логи контейнеров Docker. Сегодня передам туда системные логи формата journald или текстовых файлов от syslog. Я покажу пример с обоими типами логов, а вы уже по месту сможете выбрать, какие использовать.

Изначально у Grafana для сбора логов с хостов была небольшая программа Promtail. Её и сейчас можно использовать, но больше её не развивают и не обновляют. На замену предложен Alloy - огромный комбайн, который включает в себя и сбор логов, их обработку и насыщение дополнительными данными, и преобразование, сбор трейсов, а также отправку системных метрик в Prometheus вместо Node Exporter. То есть Alloy объединяет логи и метрики.

В итоге вместо легковесного и простого в настройке продукта мы получаем комбайн всё в одном. Если используется полный стек Grafana в виде мониторинга, логов и трассировки, то наверное это удобно. Если собираются только логи, то не очень. Вместо Alloy можно взять Fluent Bit, Fluentd или Vector. Последние два легковесны, популярны, с простой настройкой. Можно взять и их. Но я в своём примере ограничусь стеком Grafana и буду использовать Alloy.

Репозиторий Grafana для IP адресов из России заблокирован. В общем случае он добавляется вот так:

# mkdir -p /etc/apt/keyrings
# wget -O /etc/apt/keyrings/grafana.asc https://apt.grafana.com/gpg-full.key
# chmod 644 /etc/apt/keyrings/grafana.asc
# echo "deb [signed-by=/etc/apt/keyrings/grafana.asc] https://apt.grafana.com stable main" > /etc/apt/sources.list.d/grafana.list

Мы же подключим копию репозитория из зеркала Яндекса. Для краткости я подключу его без ключа. Если вам это не подходит, то скачайте ключ и как-то передайте его на целевые машины:

# echo "deb [trusted=yes] https://mirror.yandex.ru/mirrors/packages.grafana.com/oss/deb/ stable main" > /etc/apt/sources.list.d/grafana.list
# apt update
# apt install alloy

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

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

Забирайте config.alloy из моего репозитория, копируйте в /etc/alloy и перезапускайте службу. Заодно добавьте в автозагрузку. По умолчанию она вроде не делает этого:

# systemctl restart alloy
# systemctl enable alloy

Больше ничего делать не надо. На все хосты Alloy устанавливается и настраивается аналогично. В Loki логи будут прилетать с метками в виде %hostname%-logs и %hostname%-journal. Соответственно, по именам серверов вы и сможете их там выбирать. Метки, если что, можно изменить. Они настраиваются в параметрах labels и job соответственно. В конфигурации это всё наглядно видно.

По аналогии можно добавить любые текстовые логи. Тут никакой привязки к syslog нет. Просто забираем текстовые логи, определённые параметром:

  __path__  = "/var/log/{syslog,messages,*.log}",

Теперь можно идти в Grafana, раздел DrilldownLogs. Выбираем в выпадающем списке service с нужным именем и типом логов и смотрим.

Единственное, что мне не нравится тут, так это то, что в тексте лога есть метки времени, и в самом хранилище есть метки времени, когда запись была добавлена. Иногда они не совпадают и это неудобно. В Logstash есть модуль date для того, чтобы выделять дату из текста поступающих логов и использовать ее в качестве даты документа в Elasticsearch.
Кто-нибудь настраивал подобное в Loki, чтобы время документа совпадало со временем в логе?

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

———
ServerAdmin: 📱 Telegram | 🌐 Сайт | 📲 MAX

#loki #logs #devops
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍79👎2
Продолжу одновременно две темы, которые развиваю последнее время - почтовый сервер на базе Postfix и сбор логов в Loki. Покажу, как очень просто и быстро собирать логи Postfix в Loki с базовым анализом содержимого и простенькой визуализацией в дашборде.

Напомню, что у меня есть подробная статья про мониторинг Postfix с помощью Zabbix. Там в том числе выполняется и анализ логов, но локально, а в систему мониторинга уходит результат локальной обработки. Сами логи Postfix не хранятся.

Сегодня я рассмотрю другой вариант - непосредственно хранение логов на внешнем сервере Loki, который сам будет парсить данные и выполнять некоторую аналитику. Я выведу на дашборд метрики:

◽️Количество доставленных и отклонённых писем в виде соотношения и временной шкалы
◽️Статистика по доменам внешних получателей писем от нас
◽️Статистика по полученным письмам локальных доменов нашего сервера
◽️Статистика по отклонённым письмам в разрезе ошибок и доменов

Помимо этого Loki автоматически будет парсить поступающие логи, что позволит выполнять группировки по 24 распознанным полям: имя получателя, имя отправителя, домен отправителя, IP адрес, ID сообщения, статусы и т.д.

Данную заметку я пишу на примере реального почтового сервера, который я настроил по этой своей статье. Это важно, так как в разных версиях Postfix немного отличается формат логов. Я за основу взял готовый Dashboard из базы Grafana и подправил его под свою версию сервера и настроек Alloy, которые я возьму из этой заметки. А сам Loki установлен и настроен так же, как тут.

Первым делом устанавливаем Alloy на почтовый сервер с Postfix. Посмотреть установку можно в предыдущей заметке. Для сбора только почтовых логов достаточно такой конфигурации:

loki.write "default" {
  endpoint {
    url = "http://195.20.47.169:3100/loki/api/v1/push"
  }
  external_labels = {}
}

local.file_match "postfix" {
 path_targets = [{
  __address__ = "localhost",
  __path__  = "/var/log/mail.log",
  instance  = constants.hostname,
  job     = string.format("%s-maillog", constants.hostname),
 }]
}

loki.source.file "postfix" {
 targets  = local.file_match.postfix.targets
 forward_to = [loki.write.default.receiver]
}


После этого логи сразу потекут в Loki. Их можно смотреть в разделе DrilldownLogs. В качестве service_name в соответствии с настройками Ally будет указано имя сервера и приписка -maillog. В моём случай это будет mail.zeroxzed.ru-maillog. На картинках другое название, но это мне показалось более удачное.

Далее нам нужно импортировать дашборд. Я положил его в свой репозиторий grafana-loki, в раздел grafana/dashboards/, файл Postfix Delivery Status.json. Его нужно скачать и импортировать в Grafana. Во время импорта в качестве источника данных укажите свой Datasource с Loki. Если он не подцепится автоматически, то после импорта зайдите в настройки дашборда, раздел Variables, укажите его явно в переменной DS_LOKI.

Если у вас Loki и Postfix настроены по моим статьям и заметкам, на которые я дал ссылки, то всё должно получиться, потому что все настройки я взял с работающего сервера. Проверил в момент написания заметки. Как это всё выглядит, видно ниже на скриншотах.

Если что-то не работает на дашборде, значит либо лог немного отличается, там локальный парсер прямо в настройках виджетов, либо выборка по меткам не совпадает, если свои метки ставили. Всё это проверяется тут же, в дашборде, в настройках виджетов. Я так всё и правил в изначальном дашборде. У меня после импорта ничего не работало. Поправил и шаблоны парсинга, и метки под свои настройки, добавил ещё один виджет, разделив внешних и внутренних получателей. В итоге всё получилось.

Ниже публикую файлы, которые используются в заметке. Они же продублированы в репозитории.

Подобная настройка максимально простая и быстрая, настраивается буквально за 5 минут по готовым конфигам и шаблонам. Плюс, это всё в формате IaC.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

———
ServerAdmin: 📱 Telegram | 🌐 Сайт | 📲 MAX

#loki #logs #mailserver #postfix
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍66👎1
Прорабатываю тему централизованного хранения логов в Loki. Потом для удобства объединю её в большую статью. Уже наметил план. Решил, чтобы вечно не откладывать, резать слона по частям, а не пытаться сразу всё сделать.

На текущий момент я разобрал следующие темы:

1️⃣ Установка, настройка Loki, сбор логов Docker контейнеров
2️⃣ Сбор системных логов Linux (syslog и journald) с помощью Alloy
3️⃣ Сбор логов Postfix и пример создания дашборда для них

Сегодня разберу вопрос отправки журналов с логами Windows. Как бы не пытались аврально импортозаместиться, всё равно инфраструктура на Windows - значительная часть. А может и бóльшая, смотря как считать.

На удивление, настройка Alloy оказалась довольно замороченной, несмотря на то, что есть документация. ИИ по какой-то причине предлагает постоянно неработающие конфигурации. Я что с Linux, что с Windows в итоге разбирался сам.

Основная проблем с метками, привязанными к имени сервера и с их синтаксисом в конфигурации в целом. С непривычки приходится много времени тратить, чтобы разобраться. Вообще, это самая важная часть настройки сбора логов в Loki, так как тут выборка в основном по ним идёт. Надо сразу аккуратно продумать всю схему, чтобы потом не путаться.

Установка Alloy в Windows максимально простая - скачиваем установщик из репозитория и запускаем. Нужен будет файл alloy-installer-windows-amd64.exe.

Alloy устанавливается как служба с автозапуском. После установки нужно отредактировать конфигурацию. К сожалению, если я правильно понял, для логов Windows не работает автообнаружение всех системных журналов, в том числе служб и сервисов с автоматическим назначением меток к ним. Их нужно явно указывать в конфигурации.

Покажу пример с тремя стандартными журналами: System, Application и Security. Положил работающий и отлаженный файл конфигурации в репозиторий. На винде отлаживать неудобно, так как если в конфигурации была ошибка, служба тупо не запускалась с неинформативной ошибкой. Приходилось вручную всё проверять и пробовать разные варианты.

В итоге получил то, что хотел. Для логов назначил две метки:

◽️instance = "имя сервера", например WINSRV01.
◽️job = "имя сервера"-"имя журнала", то есть WINSRV01-application.

С этими метками можно просто открыть все логи сервера по имени и в нём по меткам открыть нужные потоки. Но если будет необходимость сразу из общего списка взять отдельный job конкретного сервера, это тоже можно сделать, так как в названии job будет имя сервера.

Редактируем конфигурацию, перезапускаем службу Alloy и идём в Grafana смотреть логи. Никаких дополнительных настроек делать не надо. Loki сам парсит виндовые логи и выделяет в них стандартные поля: event_id, channel, level, security_userId, timeCreated и т.д. По ним сразу можно делать выборку.

Несмотря на некоторые трудности и неудобства стека на базе Loki и Alloy, пользоваться им приятно в том плане, что базовые настройки относительно просты и функциональны. Можно особо не заморачиваясь просто отправлять логи в Loki и с ними тут будет удобно работать. Он сам распарсит стандартные типы, что позволит сразу выборки делать и рисовать дашборды. Когда изучал ELK с парсингом больше ковырялся. Тут он как-то проще работает.

Далее планирую разобрать сбор логов веб сервера и создание дашбордов для них с важными метриками. Плюс, отдельно хранение и очистку старых журналов. А потом всё это можно будет собрать в единую законченную статью.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

———
ServerAdmin: 📱 Telegram | 🌐 Сайт | 📲 MAX

#loki #logs #devops
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍98👎1
Вчера в очередной раз разбирался с Loki. Хочу в него собрать все необходимые мне логи, чтобы получить готовое универсальное решение. В основном всё уже разобрал, остался обычный формат syslog, чтобы собирать логи с сетевых устройств. Loki принимать напрямую syslog не умеет. Нужно использовать какое-то промежуточное звено. И выбор тут такой:

◽️Alloy или Promtail
◽️Vector или другой похожий сторонний софт
◽️Сбор логов в текстовый файл с помощью rsyslog и отправка

Решил использовать рекомендуемый самой Графаной Alloy. Конфигурация там простая. В общем случае достаточно будет такой:

loki.write "default" {
endpoint {
url = "http://192.168.137.30:3100/loki/api/v1/push"
}
external_labels = {}
}

loki.source.syslog "syslog_in" {
listener {
address = "0.0.0.0:1514"
protocol = "udp"
labels = { job = "syslog" }
}
forward_to = [loki.process.syslog_process.receiver]
}

loki.process "syslog_process" {
stage.labels {
values = {
remote_ip = "__syslog_connection_ip_address",
hostname = "__syslog_message_hostname",
app = "__syslog_message_app_name",
}
}

forward_to = [loki.write.default.receiver]
}


Принимаем логи по UDP на порт 1514, добавляем немного меток и отправляем в Loki. Кажется, всё просто, но на деле - нет. Если у вас устройство шлёт syslog формата RFC5424, то проблем не будет. Для тестов взял Mikrotik, так как мне важно собирать с них логи. И ничего не получилось. Alloy ожидает логи по стандарту RFC5424 (structured syslog), а Mikrotik шлёт в неполном формате RFC3164. Там логи вида:

system,info,account user admin logged in from 192.168.137.10 via ssh

Alloy ругается на этот лог и не может его распарсить. Почитал документацию alloy и нашёл параметр:

syslog_format = "rfc3164"

Добавил его, логи всё равно не идут. Поменял в Mikrotik формат логов с default на BSD Syslog и логи пошли в Loki, но без информации об адресе отправителя, что очень неудобно, когда у тебя много устройств.

Дальше я реализовал для сбора несколько вариантов, чтобы понять, какой удобнее всего:

◽️Принимать логи в rsyslog в текстовые файлы, а потом забирать их alloy.
◽️Принимать логи в rsyslog насыщать их дополнительными полями и переправлять в alloy.
◽️Использовать для приёма логов Vector. Он принимает микротиковские логи разных форматах.

В первых двух способах парсинг полей недоступен. Чтобы он работал, надо вручную добавлять этап обработки микротиковских логов какой-то регуляркой, выделять поля и передавать структурированные данные в alloy. Я попробовал быстренько это реализовать, но не получилось. Надо разбираться и отлаживать. Задача нетиповая, ИИшки не помогают, предлагают откровенную неработающую лажу. Мне не сказать, что сильно это надо. Конкретно от Микротиков мне важно просто хранить текстовые логи. Их обычно немного, какие-то выборки и группировки не нужны.

Пример того, как записать логи формата syslog с Микротиков в текстовые файлы, я показывал ранее. Сохраняем логи в разные файлы и забираем их с помощью Alloy. Это самый простой способ, что называется - в лоб. Работает надёжно и прост в настройке. Отладка особо не нужна, у меня сразу заработало, в отличие от других вариантов. Фильтрация устройств работает по имени файла, в котором отражён IP.

Второй вариант с пересылкой через rsyslog у меня тоже получился, хоть и не сразу. Пришлось повозиться и отлаживать. Ниже часть конфигурации rsyslog.conf, которая отвечает за приём логов формата default в Mikrotik и пересылку в локальный alloy с добавлением полей до формата RFC5424:

module(load="imudp")
input(type="imudp" port="514" ruleset="to_alloy")

template(name="RFC5424_Wrapper" type="string"
  string="<%PRI%>1 %TIMESTAMP:::date-rfc3339% %HOSTNAME% mikrotik - - - %msg:2:$%\n"
)

ruleset(name="to_alloy") {
  action(type="omfwd"
      target="127.0.0.1"
      port="1514"
      protocol="udp"
      template="RFC5424_Wrapper")
  stop
}


В итоге самым удобным вариантом оказался Vector. Не хватает лимита по объёму, так что вечером покажу подробно отдельной публикацией.

———
ServerAdmin: 📱 Telegram | 🌐 Сайт | 📲 MAX 😩

#loki #mikrotik
Please open Telegram to view this post
VIEW IN TELEGRAM
👍66👎3
Завершу тему с Loki и Mikrotik окончательным и максимально удобным решением, к которому я пришёл, и которое можно сохранить себе. Я в итоге применил Vector, про который я уже не раз упоминал и которым я пользуюсь для других задач. Мне этот сборщик, обработчик и отправитель логов нравится больше всего. На примере настройки ниже вы сами убедитесь в его удобстве.

Ставим Vector любым удобным для вас способом. Я выбираю пакеты:

# bash -c "$(curl -L https://setup.vector.dev)"
# apt install vector

Приводим конфигурацию /etc/vector/vector.yaml к следующему виду:

sources:
 syslog_udp:
  type: syslog
  address: 0.0.0.0:3514
  mode: udp

sinks:
 syslog_to_loki:
  type: loki
  inputs:
   - syslog_udp
  compression: none
  encoding:
   codec: json
  endpoint: http://192.168.137.30:3100
  labels:
   job: mikrotik


Перезапускаем Vector:

# systemctl restart vector

Сравните это с конфигурациями Alloy. Небо и земля по читаемости. Здесь я на вход принимаю syslog любых форматов. А на выходе выпускаю json. Хотя у Vector в документации на выходе есть формат syslog. Я сначала с ним пробовал, так как это выглядит логично. Но на практике итоговый результат с json лучше.

Теперь идём в Mikrotik в раздел SystemLoggingActions и добавляем новое действие. Я назвал его Loki, указал адрес и порт сервера, где установлен Vector, в качестве Remote Log Format выбрал BSD Syslog. После этого в разделе Rules добавил новое правило для логов System действие - Loki. Всё, в Микротике больше ничего делать не надо.

Можно идти в Loki и смотреть логи. Не нужно специально настраивать парсинг логов, добавлять дополнительные метки и т.д. Всё, что надо, уже есть. При такой настройке Vector вы получите в логах следующие поля:

▪️hostname
▪️source_ip
▪️message

Ну и некоторые другие, которые уже не так нужны. Главное, что есть эти. Теперь можно легко различать логи из единого потока по устройствам. И не нужно настраивать разные приёмники или как-то насыщать логи дополнительной информацией об отправителях. При других настройках, в том числе в Alloy, я не смог добиться автоматического парсинга этих полей. А в Vector заработало сразу, благодаря его внутреннему преобразованию syslog в json.

Рекомендую познакомиться с Vector, если ещё не доводилось пользоваться. Он берёт логи из любых источников, например из обычного файла, docker logs, journald, kafka, kubernetes logs, logstash и ещё 40 различных программ и кладёт их в кучу разных источников: loki, elasticsearch, prometheus, clickhouse, postgres, текстовый файл и ещё около 50-ти различных типов. То есть он может взять практически всё что угодно, отправлять куда угодно, попутно преобразовывая. И при этом у него отличная документация с примерами.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

———
ServerAdmin: 📱 Telegram | 🌐 Сайт | 📲 MAX 😩

#loki #mikrotik
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍122👎1
Я наконец-то дописал статью про сбор и хранение логов в Loki:

Настройка Grafana Loki для сбора логов

Написал в формате, как делал раньше - достаточно бездумного копипаста, чтобы всё получилось. То есть если вам не хочется вникать, то можно этого не делать. Просто копируете то, что я предлагаю, и всё получится. Я постарался зафиксировать все нюансы, ничего не пропуская.

В статье рассказано, как развернуть Loki и отправить туда:

◽️Системные логи Linux и Windows
◽️Логи Docker контейнеров
◽️Логи веб сервера Nginx или Angie
◽️Логи сетевых устройств

То есть дана база для внедрения системы в разнородной инфраструктуре, чтобы собрать вообще все логи в одном месте. База не в плане внедрения, а в плане обзора возможностей и технических нюансов работы непосредственно с Loki. Автоматизацию этого процесса нужно будет делать самостоятельно по месту.

Помимо сбора логов я показал на примере веб сервера, как делать свои дашборды, и как выборочно удалять данные из хранилища.

Весь текст написан и проверен полностью мной. ИИ привлекал только для изучения и подготовки своих конфигураций. Я сам изучал продукт с нуля, поэтому старался разобраться с основными моментами. Вообще все материалы, которые я пишу, я делаю сам от и до. После ИИ всё перепроверяю и дополняю.

В целом, система мне понравилась. Много лет я собираю логи в ELK Stack. Он более функциональный, порог входа у него выше, и потребление ресурсов тоже заметно выше, чем у Loki. У них разный формат хранения и обработки данных, из-за этого сильно отличаются возможности по визуализации. Некоторые вещи по выборке и подготовке данных, которые сразу работают в ELK, в Loki в лоб не работают.

Например, нельзя просто взять и сформировать топ 10 IP адресов клиентов сайта, которые сделали больше всего запросов за сутки или неделю. Если в ELK я просто брал и делал это на дашборде, то Loki выдаёт ошибки на слишком большой объём данных, который нужно обработать для выполнения запросов. Там нужно это реализовывать по другому. Ну и других различий много: аутентификация, очистка данных, отказоустойчивость и многое другое в ELK более развито.

Если нужно что-то проще и легковеснее, чем Loki, то можно взять VictoriaLogs. Там всё проще и быстрее, чем в Loki. По крайней мере год назад так было, когда я тестировал этот продукт. Он активно развивается, так что в планах ещё раз его попробовать в таком же формате, как Loki, собрав туда разнородные логи со всех систем. Это если время найду на это. Особой нужды лично у меня в этом нет.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

———
ServerAdmin: 📱 Telegram | 🌐 Сайт | 📲 MAX 😩

#loki #logs #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍156👎1
Когда рассказывал про стэк Loki со сборщиком логов Alloy, не упомянул один важный момент, про который сам не знал, но подсказал один из читателей. Это существенное дополнение, которое будет актуально для использования любого софта.

Alloy по умолчанию отправляет какие-то данные по адресу https://stats.grafana.org/alloy-usage-report/. Причём это его поведение по умолчанию. Явно об этом нигде не говорится при скачивании и установке, но можно прочитать в документации, если специально искать или изучать её всю. Со слов разработчиков, данные обезличенные и нужны для развития продукта. А что там на самом деле - кто знает. Надо исходники изучать.

У подписчика Alloy начал сыпать ошибками на недоступность этого адреса, поэтому он и узнал об этом. Отключение сбора статистики, как специально, сделано не очень удобно. Для этого нет отдельного параметра в конфигурации. Необходимо любо добавить ключ --disable-reporting к исполняемому файлу, либо добавить этот параметр в окружение сервиса. В Debian это можно сделать в файле /etc/default/alloy. В параметр CUSTOM_ARGS надо добавить этот ключ:

CUSTOM_ARGS="--disable-reporting"

Прошёлся по всем своим установкам и отключил отправку статистики. Теперь возьму себе за правило для каждого софта делать такую проверку. Хотя бы ИИ спрашивать на наличие функциональности по отправке данных и способах её отключения.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

———
ServerAdmin: 📱 Telegram | 🌐 Сайт | 📲 MAX 😩

#loki
Please open Telegram to view this post
VIEW IN TELEGRAM
👍138👎1
Небольшой практический совет для тех, кто собирает или планирует собирать логи Docker контейнеров в Loki. У меня был подробный цикл заметок по этой теме:

1️⃣ Установка, настройка Loki, сбор логов Docker контейнеров
2️⃣ Сбор системных логов Linux (syslog и journald) с помощью Alloy
3️⃣ Сбор логов Postfix и пример создания дашборда для них
4️⃣ Сбор журналов Windows.
5️⃣ Приём логов Syslog с помощью Vector
6️⃣ Отключение сбора статистки в Alloy

Также есть общая статья со всеми этими темами. Мне нравится эта система. Я её сейчас постоянно использую. Скорее всего больше не буду настраивать ELK, так как для моих задач мне Loki хватает, хотя она и менее функциональная, но проще в настройке и меньше требует ресурсов.

Во время изучения Loki собирал логи с помощью встроенного плагина докер - grafana/loki-docker-driver. Он удобен в первую очередь тем, что можно в каждом конкретном контейнере указать, что логи отправляются в Loki. Примерно так:

  logging:
   driver: loki
   options:
    loki-url: "http://192.168.137.30:3100/loki/api/v1/push"
    loki-retries: 2
    loki-max-backoff: 800ms
    loki-timeout: 1s
    keep-file: "true"
    mode: "non-blocking"

Благодаря этому можно выбирать, какой контейнер и куда отправляет логи. Если вам нужны логи только от одного контейнера, а у вас их крутится 10, то этот драйвер будет в самый раз.

Но у такого подхода есть существенные минусы, с которыми я столкнулся:

1️⃣ Сам по себе драйвер - отдельная сущность. И если в нём будут ошибки, то у вас не запустятся контейнеры, которые от него зависят. И я эти ошибки ловил. Не всегда и не везде, но иногда было так, что этот драйвер по какой-то причине не запускался. Причём быстро выяснить причину не удавалось. Просто не запускался автоматически loki.sock после перезагрузки хоста. Лечилось ручным запуском. Причина была не в том, что Loki недоступен.

2️⃣ За плагином надо отдельно следить и обновлять. Причём обновление требует перезапуска самой службы Docker со всеми вытекающими последствиями в виде остановки или перезапуска контейнеров в зависимости от их настроек. Это если у вас не включен параметр live-restore. С ним контейнеры не будут перезапускаться вместе со службой. По умолчанию этот параметр не активен. С ним есть свои нюансы.

Для более надёжной и стабильной работы логи докера лучше вынести в текстовый файл и забирать сборщиком логов, который вы обычно используете. Он и так скорее всего будет установлен для сбора системных логов, так что добавить в него сбор ещё одного текстового лога будет не очень накладно. А если нужно фильтровать контейнеры, для которых нужен сбор логов, можно в них добавлять отдельную метку для этого. Тот же Alloy без проблем отфильтрует контейнеры по этой метке.

❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

———
ServerAdmin: 📱 Telegram | 🌐 Сайт | 📲 MAX 😩

#docker #logs #loki #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍53👎1