Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Cloud Logging
  • Начало работы
    • Все руководства
    • Передача логов кластера Yandex Managed Service for Kubernetes в Cloud Logging
    • Передача логов с ВМ в Cloud Logging
    • Передача логов с COI в Cloud Logging
    • Передача логов через HTTP-вход Unified Agent в Cloud Logging
    • Репликация логов в Object Storage с помощью Fluent Bit
    • Репликация логов в Object Storage с помощью Data Streams
    • Визуализация логов в Grafana с помощью плагина Yandex Cloud Logging
    • Интерактивная отладка функций Cloud Functions
    • Запись логов балансировщика в PostgreSQL
    • Настройки логирования для Ingress-контроллеров Application Load Balancer
    • Обработка логов Cloud Logging
    • Настройка реагирования в Cloud Logging и Yandex Cloud Functions
    • Поиск событий Yandex Cloud в Cloud Logging
  • Управление доступом
  • Правила тарификации
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • Вопросы и ответы
  • Обучающие курсы

В этой статье:

  • Перед началом работы
  • Создайте приложение, генерирующее логи
  • Создайте Docker-образ и загрузите его в реестр
  • Настройте Fluent Bit
  • Создайте ВМ из образа Container Optimized Image
  • Посмотрите логи
  • Удалите созданные ресурсы
  1. Практические руководства
  2. Передача логов с COI в Cloud Logging

Передача логов с Container Optimized Image в Cloud Logging

Статья создана
Yandex Cloud
Улучшена
mmerihsesh
Обновлена 28 апреля 2025 г.
  • Перед началом работы
  • Создайте приложение, генерирующее логи
  • Создайте Docker-образ и загрузите его в реестр
  • Настройте Fluent Bit
  • Создайте ВМ из образа Container Optimized Image
  • Посмотрите логи
  • Удалите созданные ресурсы

Обработчик логов Fluent Bit позволяет транслировать логи с виртуальных машин, созданных из образов Container Optimized Image, в сервис Yandex Cloud Logging. Для передачи логов используется модуль Fluent Bit plugin for Yandex Cloud Logging.

Чтобы настроить передачу логов с ВМ, созданной из образа Container Optimized Image:

  1. Создайте приложение, генерирующее логи.
  2. Создайте Docker-образ и загрузите его в реестр.
  3. Настройте Fluent Bit.
  4. Создайте ВМ из образа Container Optimized Image.

Перед началом работыПеред началом работы

  1. Создайте сервисный аккаунт с ролями logging.writer и container-registry.images.puller на каталог.
  2. Создайте реестр Yandex Container Registry.
  3. Создайте облачную сеть. При создании выберите опцию Создать подсети.

Создайте приложение, генерирующее логиСоздайте приложение, генерирующее логи

Создайте файл logs.py:

import logging
import random
import sys
import time

import uuid

logger = logging.getLogger(__name__)

# Задаем формат логов.
formatter = logging.Formatter(
  '[req_id=%(req_id)s] [%(levelname)s] %(code)d %(message)s'
)

handler = logging.StreamHandler(stream=sys.stdout)
handler.setFormatter(formatter)

logger.addHandler(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 += '=%s' % 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:
    req_id = uuid.uuid4()
    # Создаем пару — код и значение URL.
    path, code = fake_url()
    extra = {"code": code, "req_id": req_id}
    # Если код 200, пишем в лог с уровнем Info.
    if code == 200:
      logger.info(
        'Path: %s',
        path,
        extra=extra,
      )
    # Иначе с уровнем Error.
    else:
      logger.error(
        'Error: %s',
        path,
        extra=extra,
      )
    # Чтобы было несколько сообщений с одинаковым request id, в 30% случаев пишем вторую запись в лог с уровнем Debug.
    if random.random() > 0.7:
      logger.debug("some additional debug log record %f", random.random(), extra=extra)

    # Ждем одну секунду, чтобы не засорять журнал.
    time.sleep(1)

Создайте Docker-образ и загрузите его в реестрСоздайте Docker-образ и загрузите его в реестр

  1. Создайте файл Dockerfile и добавьте в него следующие строки:

    FROM python:3.10
    
    WORKDIR /usr/src/app
    
    COPY logs.py .
    
    CMD [ "python", "./logs.py" ]
    

    Dockerfile описывает Docker-образ, который содержит приложение, генерирующее логи.

  2. Соберите Docker-образ:

    docker build . \
      -t cr.yandex/<идентификатор_реестра>/coi:logs
    
  3. Аутентифицируйтесь в реестре и загрузите в него Docker-образ:

    docker push cr.yandex/<идентификатор_реестра>/coi:logs
    

Настройте Fluent BitНастройте Fluent Bit

  1. Создайте файл spec.yaml. Он описывает спецификацию двух контейнеров: с приложением, генерирующим логи, и агентом Fluent Bit.

    Укажите в поле:

    • image — URL Docker-образа. Чтобы узнать его, в консоли управления перейдите на страницу Обзор Docker-образа и скопируйте значение из поля Теги.
    • YC_GROUP_ID — идентификатор лог-группы по умолчанию default.

    В секции fluentbit, в поле image, указан актуальный на момент написания инструкции образ контейнера с агентом Fluent Bit. Список всех доступных образов можно найти по ссылке.

    version: '3.7'
    services:
      logs:
        container_name: logs-app
        image: <URL_Docker-образа>
        restart: always
        depends_on:
          - fluentbit
        logging:
          # Fluent Bit понимает логи в этом формате.
          driver: fluentd
          options:
            # Fluent Bit слушает логи на порту 24224.
            fluentd-address: localhost:24224
            # Теги используются для маршрутизации логов.
            tag: app.logs
    
      fluentbit:
        container_name: fluentbit
        image: cr.yandex/yc/fluent-bit-plugin-yandex:v1.0.3-fluent-bit-1.8.6
        ports:
          - 24224:24224
          - 24224:24224/udp
        restart: always
        environment:
          YC_GROUP_ID: <идентификатор_лог-группы>
        volumes:
          - /etc/fluentbit/fluentbit.conf:/fluent-bit/etc/fluent-bit.conf
          - /etc/fluentbit/parsers.conf:/fluent-bit/etc/parsers.conf
    
  2. Создайте файл user-data.yaml. Он описывает правила, по которым будут читаться логи контейнера. Если необходимо, в секции users измените имя пользователя и SSH-ключ. Подробнее о том, как сгенерировать SSH-ключи.

    #cloud-config
    write_files:
      - content: |
          [SERVICE]
              Flush         1
              Log_File      /var/log/fluentbit.log
              Log_Level     error
              Daemon        off
              Parsers_File  /fluent-bit/etc/parsers.conf
    
          [FILTER]
              Name parser
              Match app.logs
              Key_Name log
              Parser app_log_parser
              Reserve_Data On
    
          [INPUT]
              Name              forward
              Listen            0.0.0.0
              Port              24224
              Buffer_Chunk_Size 1M
              Buffer_Max_Size   6M
    
          [OUTPUT]
              Name            yc-logging
              Match           *
              group_id        ${YC_GROUP_ID}
              message_key     text
              level_key       severity
              default_level   WARN
              authorization   instance-service-account
        path: /etc/fluentbit/fluentbit.conf
      - content: |
          [PARSER]
              Name   app_log_parser
              Format regex
              Regex  ^\[req_id=(?<req_id>[0-9a-fA-F\-]+)\] \[(?<severity>.*)\] (?<code>\d+) (?<text>.*)$
              Types  code:integer
        path: /etc/fluentbit/parsers.conf
    
    users:
      - name: username
        groups: sudo
        shell: /bin/bash
        sudo: 'ALL=(ALL) NOPASSWD:ALL'
        ssh_authorized_keys:
          - ssh-ed25519 AAAA
    

    В секции SERVICE указаны настройки приложения Fluent Bit. Подробнее о настройках.

    В секции INPUT указано, откуда и как забирать логи. Для работы с логами в формате Fluentd и Fluent Bit используется протокол forward. Fluent Bit слушает логи на порту 24224.

    В секции PARSER описан парсер regex. В нем задано регулярное выражение, с помощью которого обрабатываются записи:

    • req_id — уникальный идентификатор запроса.
    • severity — уровень логирования.
    • code — HTTP-код ответа.
    • text — весь остальной текст.

    В секции FILTER указано, что ищутся только записи с тегом app.logs. Поле log каждой записи обрабатывается парсером regex, все остальные поля сохраняются в Reserve_Data On.

Создайте ВМ из образа Container Optimized ImageСоздайте ВМ из образа Container Optimized Image

Укажите в поле:

  • --zone — зону доступности, например ru-central1-a.
  • --subnet-name — имя подсети в указанной зоне.
  • --service-account-name — имя сервисного аккаунта.
IMAGE_ID=$(yc compute image get-latest-from-family container-optimized-image --folder-id standard-images --format=json | jq -r .id)

yc compute instance create \
  --name coi-vm \
  --zone=<зона> \
  --network-interface subnet-name=<имя_подсети>,nat-ip-version=ipv4 \
  --metadata-from-file user-data=user-data.yaml,docker-compose=spec.yaml \
  --create-boot-disk image-id=${IMAGE_ID} \
  --service-account-name <имя_сервисного_аккаунта>

Примечание

Команды yc compute instance create | create-with-container | update | add-metadata поддерживают подстановку в метаданные ВМ значений переменных окружения. Эти значения, заданные в ключе user-data в формате $<имя_переменной>, в момент выполнения команды Yandex Cloud CLI будут подставлены в метаданные ВМ из переменных окружения среды, в которой выполняется команда.

Чтобы изменить такое поведение, не подставлять значение переменной из среды выполнения команды CLI и передать в метаданные ВМ имя переменной в формате $<имя_переменной>, используйте синтаксис с двумя символами доллара. Например: $$<имя_переменной>.

Подробнее см. в разделе Особенности передачи переменных окружения в метаданных через CLI.

Посмотрите логиПосмотрите логи

Консоль управления
CLI
API
  1. В консоли управления перейдите в каталог, в котором находится лог-группа default, идентификатор которой вы указали в файле spec.yaml.
  2. Выберите сервис Cloud Logging.
  3. Выберите лог-группу default. На открывшейся странице отобразятся записи.

Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.

По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.

Чтобы посмотреть записи в лог-группе, выполните команду:

yc logging read --group-id=<идентификатор_лог-группы>

Где --group-id — идентификатор лог-группы default, который указан в файле spec.yaml.

Посмотреть записи в лог-группе можно с помощью вызова gRPC API LogReadingService/Read.

Удалите созданные ресурсыУдалите созданные ресурсы

Если созданные ресурсы вам больше не нужны, удалите их:

  1. Удалите облачную сеть.
  2. Удалите Docker-образ.
  3. Удалите реестр.
  4. Удалите ВМ.
  5. Удалите лог-группу.

Была ли статья полезна?

Предыдущая
Передача логов с ВМ в Cloud Logging
Следующая
Передача логов через HTTP-вход Unified Agent в Cloud Logging
Проект Яндекса
© 2025 ООО «Яндекс.Облако»