Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
Yandex Container Solution
  • Сопоставление с другими сервисами Yandex Cloud
  • Начало работы
  • Практические руководства
    • Все руководства
    • Создать ВМ с Container Optimized Image
    • Создать ВМ с Container Optimized Image и дополнительным томом для Docker-контейнера
    • Создать ВМ с Container Optimized Image и несколькими Docker-контейнерами
    • Создать группу ВМ с Container Optimized Image
    • Создать группу ВМ с Container Optimized Image и несколькими Docker-контейнерами
    • Изменить ВМ с Container Optimized Image
    • Настройка вывода информации из Docker-контейнера в серийный порт
    • Создать ВМ и группу ВМ с Container Optimized Image с помощью Terraform
    • Передача логов с COI в Cloud Logging
  • Концепции
    • Образ Container Optimized Image
    • Особенности работы с загрузочным диском
    • Особенности работы с сетью
    • Docker-образ
    • Политики перезапуска Docker-контейнера
    • Спецификации Docker-контейнера
    • Квоты и лимиты
  • Релизы COI
  • Правила тарификации
  • Вопросы и ответы
  • Решение проблем
  1. Практические руководства
  2. Передача логов с COI в Cloud Logging

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

Статья создана
Yandex Cloud
  • Перед началом работы
  • Создайте приложение, генерирующее логи
  • Создайте 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)

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

Создайте 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

  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

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

  • 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 <имя_сервисного_аккаунта>

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

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

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

По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name или --folder-id.

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

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

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

Посмотреть записи в лог-группе можно с помощью метода API read.

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

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

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

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

Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
В этой статье:
  • Перед началом работы
  • Создайте приложение, генерирующее логи
  • Создайте Docker-образ и загрузите его в реестр
  • Настройте Fluent Bit
  • Создайте виртуальную машину из образа Container Optimized Image
  • Посмотрите логи
  • Удалите созданные ресурсы