Передача логов с ВМ в Yandex Cloud Logging
Обработчик логов Fluent Bit
Чтобы настроить передачу логов:
Перед началом работы
-
Создайте сервисный аккаунт с ролью
logging.writer
на каталог. -
Создайте ВМ из публичного образа Ubuntu 24.04. В блоке Доступ укажите сервисный аккаунт, который создали на предыдущем шаге.
-
Подключитесь к ВМ по SSH.
-
Установите на ВМ пакеты для разработки:
sudo apt-get update sudo apt-get install -y python3-pip python3-venv python3-systemd git build-essential pkg-config libsystemd-dev golang-go
Команда устанавливает:
- python3-pip — менеджер пакетов Python (pip) для создания сервиса systemd, генерирующего логи.
- python3-venv — модуль для создания виртуальных окружений Python.
- python3-systemd — Python-библиотека для взаимодействия с systemd.
- git — система контроля версий для загрузки с GitHub исходных кодов плагина Fluent Bit for Yandex Cloud Logging.
- build-essential — компиляторы и инструменты для сборки ПО.
- pkg-config — утилита для получения флагов компиляции и линковки библиотек.
- libsystemd-dev — заголовочные файлы и библиотеки для разработки под systemd.
- golang-go — компилятор и инструменты языка Go (Golang) для сборки плагина Fluent Bit.
-
Проверьте версии установленных пакетов:
python3 --version pip3 --version go version
Результат должен быть не ниже:
Python 3.10 pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10) go version go1.17.6 linux/amd64
Создайте сервис systemd, генерирующий логи
-
Создайте директорию:
sudo mkdir -p /usr/local/bin/logtest sudo chown $USER /usr/local/bin/logtest cd /usr/local/bin/logtest
-
Создайте файл
logtest.py
:import logging import random import sys import time from systemd import journal # Настройка логгера logger = logging.getLogger("logtest") journald_handler = journal.JournalHandler(SYSLOG_IDENTIFIER="logtest") logger.addHandler(journald_handler) logger.setLevel(logging.DEBUG) # Генерируем URL-подобные значения PATHS = [ "/", "/admin", "/hello", "/docs", ] PARAMS = [ "foo", "bar", "query", "search", None ] def fake_url(): path = random.choice(PATHS) param = random.choice(PARAMS) if param: val = random.randint(0, 100) param += "={}".format(val) code = random.choices([200, 400, 404, 500], weights=[10, 2, 2, 1])[0] return "?".join(filter(None, [path, param])), code if __name__ == "__main__": while True: path, code = fake_url() if code == 200: logger.info( "Path: {}".format(path), extra={ "code": code } ) else: logger.error( "Error: {}".format(path), extra={ "code": code } ) time.sleep(1)
-
Создайте виртуальную среду и установите необходимые зависимости:
python3 -m venv ~/venv source ~/venv/bin/activate pip install systemd-python
-
Сделайте файл исполняемым:
sudo chmod +x /usr/local/bin/logtest/logtest.py
-
Создайте файл
/etc/systemd/system/logtest.service
:[Unit] Description=Log Test Service After=network.target [Service] ExecStart=/home/$USER/venv/bin/python3 /usr/local/bin/logtest/logtest.py Environment=PYTHONPATH=/home/$USER/venv/lib/python3.12/site-packages Restart=always User=$USER StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
-
Перезапустите
systemd
:sudo systemctl daemon-reload
-
Запустите и проверьте статус сервиса:
sudo systemctl start logtest sudo systemctl status logtest
Результат:
● logtest.service - Sample to show logging from a Python application to systemd Loaded: loaded (/etc/systemd/system/logtest.service; linked; vendor preset: enabled) Active: active (running) since Thu 2024-05-30 12:34:56 UTC; 5s ago Main PID: 12345 (logtest.sh) Tasks: 2 (limit: 2311) Memory: 18.5M CPU: 156ms CGroup: /system.slice/logtest.service ├─12345 /bin/bash /usr/local/bin/logtest/logtest.sh └─12346 python /usr/local/bin/logtest/logtest.py
Установите и настройте Fluent Bit
-
Добавьте GPG-ключ и репозиторий Fluent Bit:
wget -qO - https://packages.fluentbit.io/fluentbit.key | sudo apt-key add - echo "deb https://packages.fluentbit.io/ubuntu/focal focal main" | sudo tee /etc/apt/sources.list.d/fluent-bit.list
-
Установите Fluent Bit:
sudo apt-get update sudo apt-get install -y fluent-bit
Подключите плагин
-
Клонируйте репозиторий с плагином:
git clone https://github.com/yandex-cloud/fluent-bit-plugin-yandex.git cd fluent-bit-plugin-yandex
-
Создайте и настройте файл с версиями:
cat > versions.sh << 'EOL' #!/bin/bash export fluent_bit_version=3.0.3 export golang_version=1.22.2 export plugin_version=dev EOL chmod +x versions.sh source ./versions.sh
-
Соберите плагин:
CGO_ENABLED=1 go build -v -buildmode=c-shared -o yc-logging.so yclogging.go
-
Установите плагин:
sudo mkdir -p /usr/local/lib/fluent-bit/ sudo cp yc-logging.so /usr/local/lib/fluent-bit/ sudo chmod 644 /usr/local/lib/fluent-bit/yc-logging.so
-
Создайте файл
/etc/fluent-bit/plugins.conf
:[PLUGINS] Path /usr/local/lib/fluent-bit/yc-logging.so
-
Создайте файл
/etc/fluent-bit/fluent-bit.conf
:[SERVICE] Flush 1 Daemon Off Log_Level info Parsers_File parsers.conf Plugins_File plugins.conf [INPUT] Name systemd Tag host.* Systemd_Filter _SYSTEMD_UNIT=logtest.service [OUTPUT] Name yc-logging Match * resource_type logtest folder_id <идентификатор_каталога> message_key MESSAGE level_key SEVERITY default_level WARN authorization instance-service-account
Где:
folder_id
— идентификатор каталога Yandex Cloud, в лог-группу по умолчанию которого будут передаваться логи.authorization
— настройки авторизации. Значениеinstance-service-account
используется для авторизации от имени сервисного аккаунта, указанного при создании ВМ.level_key
— поле, содержащее уровень логирования.message_key
— поле, содержащее текст сообщения.default_level
— уровень логирования по умолчанию, если не указан в сообщении.
-
Перезапустите Fluent Bit:
sudo systemctl restart fluent-bit
Посмотрите логи
- Проверьте статус сервисов:
sudo systemctl status logtest
sudo systemctl status fluent-bit
Результат:
● fluent-bit.service - Fluent Bit
Loaded: loaded (/lib/systemd/system/fluent-bit.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2024-05-30 12:34:56 UTC; 5s ago
Docs: https://docs.fluentbit.io/manual/
Main PID: 12347 (fluent-bit)
Tasks: 4 (limit: 2311)
Memory: 18.8M
CPU: 156ms
CGroup: /system.slice/fluent-bit.service
└─12347 /opt/fluent-bit/bin/fluent-bit -c /etc/fluent-bit/fluent-bit.conf
-
Просмотрите логи:
# Логи тестового сервиса sudo journalctl -u logtest -n 10 | cat # Логи Fluent Bit sudo journalctl -u fluent-bit -n 20 | cat
При корректной работе:
- Оба сервиса должны иметь статус "active (running)".
- В логах тестового сервиса должны появляться сообщения вида:
Path: /admin?query=90
для успешных запросов.Error: /docs?bar=44
для ошибочных запросов.
- В логах Fluent Bit не должно быть ошибок.
-
Проверьте логи в консоли управления:
- Откройте консоль управления
. - Перейдите в каталог, указанный в
folder_id
. - Выберите сервис Cloud Logging.
- Откройте лог-группу по умолчанию
default
. - На вкладке Логи настройте фильтры:
resource_type=logtest
для просмотра логов тестового сервиса.timestamp > now()-1h
для просмотра логов за последний час.
- Откройте консоль управления
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>
. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name
или --folder-id
.
Чтобы посмотреть записи в лог-группе, выполните команду:
yc logging read --folder-id=<идентификатор_каталога>
Где --folder-id
— идентификатор каталога, который указан в настройках сервиса fluent-bit
.
Чтобы посмотреть записи в лог-группе, воспользуйтесь вызовом gRPC API LogReadingService/Read.
Устранение возможных неполадок
-
Ошибки доступа к файлам и системные проблемы:
-
Проверьте права доступа к критическим файлам:
ls -l /usr/local/lib/fluent-bit/yc-logging.so ls -l /etc/fluent-bit/plugins.conf ls -l /etc/fluent-bit/fluent-bit.conf
Корректный результат должен выглядеть так:
-rwxr-xr-x 1 root root 8123456 May 30 12:34 /usr/local/lib/fluent-bit/yc-logging.so -rw-r--r-- 1 root root 123 May 30 12:34 /etc/fluent-bit/plugins.conf -rw-r--r-- 1 root root 456 May 30 12:34 /etc/fluent-bit/fluent-bit.conf
-
Проверьте системные логи на наличие ошибок:
sudo tail -f /var/log/syslog
Пример корректных логов:
May 30 12:34:56 vm-name fluent-bit[12347]: [2024/05/30 12:34:56] [ info] [fluent bit] version=3.0.3 May 30 12:34:56 vm-name fluent-bit[12347]: [2024/05/30 12:34:56] [ info] [storage] ver=1.4.0, type=memory May 30 12:34:56 vm-name fluent-bit[12347]: [2024/05/30 12:34:56] [ info] [cmetrics] version=0.6.3
journalctl -xe
Пример корректных логов:
May 30 12:34:56 vm-name systemd[1]: Started Fluent Bit. May 30 12:34:56 vm-name fluent-bit[12347]: Fluent Bit v3.0.3 May 30 12:34:56 vm-name logtest.sh[12345]: [INFO] 200 Path: /hello?query=42
-
-
Ошибка "Permission denied":
-
Проверьте права сервисного аккаунта:
yc iam service-account list
Результат должен показать ваш сервисный аккаунт:
+----------------------+---------------+ | ID | NAME | +----------------------+---------------+ | aje5n27q235g8m3... | service-acc-1 | +----------------------+---------------+
-
Проверьте роли сервисного аккаунта:
yc iam service-account get service-acc-1
В результате должна быть роль
logging.writer
:id: aje5n27q235g8m3... folder_id: b1g4c2a3v000000000000 name: service-acc-1 roles: - logging.writer
-
-
Логи не появляются в Cloud Logging:
-
Проверьте правильность
folder_id
в конфигурации:grep folder_id /etc/fluent-bit/fluent-bit.conf
Результат должен показать ваш folder_id:
folder_id b1g4c2a3v000000000000
-
Проверьте, что плагин yc-logging правильно загружен:
sudo systemctl status fluent-bit | grep yc-logging
Корректный результат:
May 30 12:34:56 vm-name fluent-bit[12347]: [2024/05/30 12:34:56] [ info] [output:yc-logging:yc-logging.0] worker #0 started
-
-
Проблемы с форматом логов:
-
Проверьте настройки в конфигурации:
grep -A 5 '\[OUTPUT\]' /etc/fluent-bit/fluent-bit.conf
Корректный результат:
[OUTPUT] Name yc-logging Match * resource_type logtest message_key MESSAGE level_key SEVERITY
-
Проверьте формат логов в journald:
journalctl -u logtest -n 5
Корректный формат логов:
May 30 12:34:56 vm-name logtest.sh[12345]: [INFO] 200 Path: /hello?query=42 May 30 12:34:57 vm-name logtest.sh[12345]: [ERROR] 404 Error: /admin?foo=13
-
-
Ошибки доступа к файлам и системные проблемы:
-
Проверьте права доступа к критическим файлам:
ls -l /usr/local/lib/fluent-bit/yc-logging.so ls -l /etc/fluent-bit/plugins.conf ls -l /etc/fluent-bit/fluent-bit.conf
-
Проверьте системные логи на наличие ошибок:
sudo tail -f /var/log/syslog journalctl -xe
-
Убедитесь, что все файлы имеют корректные права доступа (644 для конфигурационных файлов, 755 для библиотек).
-
-
Ошибка "Permission denied":
- Проверьте права сервисного аккаунта.
- Убедитесь, что роль
logging.writer
назначена на нужный каталог. - Проверьте, что токен сервисного аккаунта действителен.
-
Логи не появляются в Cloud Logging:
-
Проверьте правильность
folder_id
в конфигурации. -
Убедитесь, что формат логов соответствует ожидаемому.
-
Проверьте, что плагин yc-logging правильно загружен:
sudo systemctl status fluent-bit | grep yc-logging
-
-
Проблемы с форматом логов:
- Проверьте настройки
message_key
иlevel_key
. - Убедитесь, что логи содержат необходимые поля.
- Проверьте формат времени в логах.
- Проверьте настройки
Полезные команды для диагностики
-
Просмотр расширенных логов Fluent Bit:
-
Отслеживание логов в реальном времени:
sudo journalctl -u fluent-bit -n 100 -f
Пример вывода:
May 30 12:34:56 vm-name fluent-bit[1234]: [info] [engine] started (pid=1234) May 30 12:34:56 vm-name fluent-bit[1234]: [info] [storage] version=1.1.6, initializing... May 30 12:34:57 vm-name fluent-bit[1234]: [info] [yc-logging] plugin initialized successfully
-
-
Проверка использования CPU и памяти:
-
Отслеживание процесса Fluent Bit:
ps aux | grep fluent-bit top -p $(pgrep fluent-bit)
Пример вывода ps:
fluent 1234 0.5 1.2 256892 12644 ? Ssl 12:34 0:02 /opt/fluent-bit/bin/fluent-bit -c /etc/fluent-bit/fluent-bit.conf
-
-
Мониторинг сетевых соединений:
-
Проверка открытых портов и соединений:
sudo netstat -tupn | grep fluent-bit
Пример вывода:
tcp 0 0 0.0.0.0:24224 0.0.0.0:* LISTEN 1234/fluent-bit tcp 0 0 10.0.0.2:52431 logging.api.cloud.yandex.net:443 ESTABLISHED 1234/fluent-bit
-
-
Проверка загрузки плагина:
-
Просмотр открытых файлов процесса:
sudo lsof -p $(pgrep fluent-bit) | grep yc-logging
Пример вывода:
fluent-bit 1234 fluent-bit mem REG 8,1 2890144 /usr/local/lib/fluent-bit/yc-logging.so
-
-
Проверка конфигурационных файлов:
-
Получение контрольных сумм:
find /etc/fluent-bit/ -type f -exec md5sum {} \;
Пример вывода:
a1b2c3d4e5f6g7h8 /etc/fluent-bit/fluent-bit.conf b2c3d4e5f6g7h8i9 /etc/fluent-bit/plugins.conf c3d4e5f6g7h8i9j0 /etc/fluent-bit/parsers.conf
-
Удалите созданные ресурсы
Если созданные ресурсы вам больше не нужны, удалите их: