Доставка логов с ВМ из systemd в Yandex Cloud Logging

Nikolay Matrosov
4 min readOct 11, 2021

Шаг 1. Пишем логи в Systemd

Возможно у вас уже есть сервис, поставку чьих логов вы хотели бы настроить, тогда вы можете переходить к шагу 2. Если же у вас такого нет, то можно воспользоваться следующим кодом на python, чтобы генерировать тестовые логи, которые впоследствии мы будем отправлять.

И так для начала нам понадобится python 3.6 и выше.

Далее заведем пользователя от которого будем писать и читать логи. В его домашнюю директорию сложим все необходимые файлы.

sudo adduser logger --disabled-password
sudo usermod -aG sudo logger
sudo passwd -d logger
sudo su logger
cd ~

Теперь нам добавим следующий код в файл logtest.py.

Теперь заведем virtualenv и установим в него все нужные зависимости:

sudo apt install python3-pip python3.8-venv
python3 -m venv venv
source venv/bin/activate
pip3 install systemd-logging

Теперь нам понадобится скрипт logtest.sh который будет вызываться Systemd для запуска нашего сервиса.

#!/bin/bashSCRIPT_PATH=$(dirname "$(realpath "$0")")
. "$SCRIPT_PATH/venv/bin/activate"
python "$SCRIPT_PATH/logtest.py"

Сделать скрипт исполняемым.

chmod +x /home/logger/logtest.sh

А затем нам нужно создать файл logtest.service с описанием нашего сервиса.

[Unit]
Description=Sample to show logging from a Python application to systemd
After=network.target
[Service]
Type=simple
ExecStart=/home/logger/logtest.sh
Restart=on-abort
User=logger
[Install]
WantedBy=multi-user.target

Этот файл может лежать в любом каталоге, который вам нравится. Я бы предложил положить его с исходным кодом на Python для этого приложения. Но чтобы systemd нашел его нам нужно придерживаться соглашением о том, куда складывать unit-файлы. Не вдаваясь в подробности о systemd (тут на целую книгу хватит и это выходит за рамки этого поста в блоге), нам нужно убедиться, что наш файл модуля имеет symlink в /etc/systemd/system. Для этого выполним следующую команду:

sudo ln -s "$(pwd)/logtest.service" \
/etc/systemd/system/logtest.service

Теперь можно перезагрузить systemd

sudo systemctl daemon-reload

Чтобы проверить, что все ок

sudo systemctl status logtest.service

Там должно быть написано, что сервис загружен, но не активен.

Теперь нам нужно его стартовать, для этого выполним:

sudo systemctl enable logtest.service
sudo systemctl start logtest.service

Теперь, если снова посмотреть статус, то там должно быть active(running).

Шаг 2. Ставим Fluentbit

Но сначала проясним пару моментов.

И там, и там птичка, так в чем же разница.

Fluentbit vs Fluentd

Чтобы упростить работу с логами когда-то появился Fluentd. Он был написан на ruby и со временем вырос в целую экосистему, которая включает и Fluentbit. Быстрое сравнение приведено в таблице.

https://docs.fluentbit.io/manual/about/fluentd-and-fluent-bit

Как видно для установки Fluentbit не нужны никакие зависимости типа ruby. И хотя к нему есть меньше плагинов, чем для Fluentd, зато он потребляет значительно меньше памяти.

Теперь разберемся как его поставить.

Сначала добавим GPG ключ, которым подписаны пакеты в репозитории fluentbit.

$ wget -qO - https://packages.fluentbit.io/fluentbit.key | sudo apt-key add -

В Ubuntu нам нужно добавить в файл /etc/apt/sources.list следующую строчку:

deb https://packages.fluentbit.io/ubuntu/focal focal main

Затем нужно обновить индексы.

sudo apt-get update

Теперь можно установить последнюю версию td-agent-bit:

sudo apt-get install td-agent-bit

После этого его остается только перезапустить.

sudo systemctl enable td-agent-bit
sudo systemctl start td-agent-bit

Что все ок можно проверить следующей командой

sudo systemctl status td-agent-bit

Там должно быть active (running)

Шаг 3. Плагин

Fluentbit поддерживает плагины написанные на go. Это экспериментальное, но вполне рабочее API.

Итак, клонируем репозиторий с кодом плагина.

git clone https://github.com/yandex-cloud/fluent-bit-plugin-yandex.git

Далее начала нам понадобится go. Инструкция по установке тут.

Теперь можно скомпилировать библиотеку.

export fluent_bit_version=1.8.6
export plugin_version=dev
CGO_ENABLED=1 go build -buildmode=c-shared \
-o ./yc-logging.so \
-ldflags "-X main.PluginVersion=${plugin_version}" \
-ldflags "-X main.FluentBitVersion=${fluent_bit_version}"

Следующим шагом копируем полученную библиотеку:

sudo cp yc-logging.so /usr/lib/td-agent-bit/yc-logging.so

И регистрируем ее в файле с конфигурацией плагинов /etc/td-agent-bit/plugins.conf.

[PLUGINS]
Path /usr/lib/td-agent-bit/yc-logging.so

Вносим изменения в конфиг самого сервиса. folder_id укажите свой. Если к ВМ привязан service account с правами писать в yandex cloud logging, то authorization нужно указать instance-service-account. Другие варианты авторизации и значение остальных параметров можно посмотреть тут.

[INPUT]
Name systemd
Tag host.*
Systemd_Filter _SYSTEMD_UNIT=logtest.service
[OUTPUT]
Name yc-logging
Match *
resource_type logtest
folder_id b1g***
message_key MESSAGE
level_key SEVERITY
default_level WARN
authorization instance-service-account

Далее перезагружаем сервис td-agent-bit.

sudo systemctl restart td-agent-bit

Отлично. Теперь можно убедиться, что логи поступают.

Yandex Cloud Logging

P.S. Настройка работы Fluentbit в контейнерах еще проще, но про нее я расскажу в следующий раз.

--

--