Доставка логов с ВМ из systemd в Yandex Cloud Logging
Шаг 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. Быстрое сравнение приведено в таблице.
Как видно для установки 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
Отлично. Теперь можно убедиться, что логи поступают.
P.S. Настройка работы Fluentbit в контейнерах еще проще, но про нее я расскажу в следующий раз.