[Документация Yandex Cloud](../../index.md) > [Yandex Object Storage](../index.md) > [Практические руководства](index.md) > Хранение журналов работы приложения

# Хранение журналов работы приложения


{% note warning %}

Часть ресурсов, необходимых для прохождения практического руководства, доступны только в [регионе Россия](../../overview/concepts/region.md).

{% endnote %}


Чтобы анализировать информацию о событиях приложений за произвольный период, журналы работы приложений необходимо надежно хранить.

Обычно приложения не отправляют журналы в системы хранения напрямую, а используют агрегаторы: [fluentd](https://www.fluentd.org), [fluentbit](https://fluentbit.io), [logstash](https://www.elastic.co/logstash/) и другие. Агрегаторы могут записывать данные непосредственно в системы хранения, но для увеличения надежности данные отправляются сначала в промежуточный буфер (шина потоков данных, [брокер сообщений](https://ru.wikipedia.org/wiki/Брокер_сообщений)), а уже оттуда — в системы хранения.

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

С помощью этой инструкции вы научитесь сохранять журналы работы приложений в Yandex Object Storage.

Чтобы настроить хранение журналов работы приложения:

1. [Подготовьте облако к работе](#before-you-begin).
1. [Настройте окружение](#setup).
1. [Создайте бакет для хранения журналов](#create-bucket).
1. [Создайте поток данных](#create-stream).
1. [Создайте трансфер](#create-transfer).
1. [Установите Fluentd](#install-fluentd).
1. [Подключите Fluentd к потоку данных](#connect).
1. [Проверьте отправку и получение данных](#test-ingestion).

Если хранение журналов вам больше не нужно, [удалите используемые им ресурсы](#clear-out).

## Подготовьте облако к работе {#before-you-begin}

Зарегистрируйтесь в Yandex Cloud и создайте [платежный аккаунт](../../billing/concepts/billing-account.md):
1. Перейдите в [консоль управления](https://kz.console.yandex.cloud), затем войдите в Yandex Cloud или зарегистрируйтесь.
1. На странице **[Yandex Cloud Billing](https://kz.console.yandex.cloud/billing)** убедитесь, что у вас подключен платежный аккаунт, и он находится в [статусе](../../billing/concepts/billing-account-statuses.md) `ACTIVE` или `TRIAL_ACTIVE`. Если платежного аккаунта нет, [создайте его](../../billing/quickstart/index.md) и [привяжите](../../billing/operations/pin-cloud.md) к нему облако.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать [каталог](../../resource-manager/concepts/resources-hierarchy.md#folder), в котором будет работать ваша инфраструктура, на [странице облака](https://kz.console.yandex.cloud/cloud).

[Подробнее об облаках и каталогах](../../resource-manager/concepts/resources-hierarchy.md).

### Необходимые платные ресурсы {#paid-resources}

В стоимость поддержки хранения журналов приложений входит:

* плата за обслуживание потока данных ([тарифы Yandex Data Streams](../../data-streams/pricing.md));
* плата за перенос данных между источниками и приемниками ([тарифы Yandex Data Transfer](../../data-transfer/pricing.md));
* плата за хранение данных ([тарифы Yandex Object Storage](../pricing.md)).

## Настройте окружение {#setup}

1. [Создайте](../../iam/operations/sa/create.md) сервисный аккаунт и [назначьте](../../iam/operations/sa/assign-role-for-sa.md) ему роль `editor` на ваш каталог.
1. [Создайте](../../iam/operations/authentication/manage-access-keys.md#create-access-key) статический ключ доступа.

Идентификатор и секретный ключ понадобятся вам на следующих шагах.

## Создайте бакет для хранения журналов {#create-bucket}

1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог, в котором хотите создать бакет.
1. Перейдите в сервис **Object Storage**.
1. Нажмите кнопку **Создать бакет**.
1. Укажите имя бакета.
1. В полях **Доступ на чтение объектов**, **Доступ к списку объектов** и **Доступ на чтение настроек** выберите **Ограниченный**.
1. В поле **Класс хранилища** выберите `Холодное`.
1. Нажмите кнопку **Создать бакет**.
  
## Создайте поток данных {#create-stream}

1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог, в котором хотите создать поток данных.
1. Перейдите в сервис **Data Streams**.
1. Нажмите кнопку **Создать поток**.
1. Укажите существующую [бессерверную](../../ydb/concepts/serverless-and-dedicated.md#serverless) базу данных YDB или [создайте](../../ydb/quickstart.md#serverless) новую. Если вы создали новую базу данных, после ее создания нажмите кнопку ![refresh-button](../../_assets/data-streams/refresh-button.svg) **Обновить** для обновления списка баз.
1. Введите имя потока данных.
1. Нажмите кнопку **Создать**.

Дождитесь запуска потока данных. Когда поток станет готов к использованию, его статус изменится с `CREATING` на `ACTIVE`.

## Создайте трансфер {#create-transfer}

1. На странице созданного потока данных нажмите кнопку **Действия** и выберите **Создать трансфер данных**.
1. Создайте эндпоинт-источник:
    1. В поле **Направление** выберите `Источник`.
    1. Укажите имя эндпоинта.
    1. В списке **Тип базы данных** выберите `Yandex Data Streams`.
    1. Выберите базу данных для источника.
    1. Введите имя созданного ранее потока данных.
    1. Выберите созданный ранее сервисный аккаунт.
    1. Нажмите кнопку **Создать**.
1. Создайте эндпоинт-приемник:
    1. Нажмите кнопку **Создать эндпоинт**.
    1. В поле **Направление** выберите `Приемник`.
    1. Укажите имя эндпоинта.
    1. В списке **Тип базы данных** выберите `Object Storage`.
    1. Введите имя созданного ранее бакета.
    1. Выберите созданный ранее сервисный аккаунт.
    1. Нажмите кнопку **Создать**.
1. Создайте трансфер:
    1. На панели слева выберите ![image](../../_assets/data-transfer/transfer.svg) **Трансферы**.
    1. Нажмите кнопку **Создать трансфер**.
    1. Введите имя трансфера.
    1. Выберите созданный ранее эндпоинт-источник.
    1. Выберите созданный ранее эндпоинт-приемник.
    1. Нажмите кнопку **Создать**.
    1. Нажмите на значок ![ellipsis](../../_assets/horizontal-ellipsis.svg) рядом с именем созданного трансфера и выберите **Активировать**.

Дождитесь активации трансфера. Когда трансфер станет готов к использованию, его статус сменится с **Создается** на **Реплицируется**.

## Установите Fluentd {#install-fluentd}

1. Скачайте и установите [Fluentd](https://www.fluentd.org/download).
1. Установите плагин Fluentd для поддержки протокола AWS Kinesis Data Streams. По этому протоколу будет осуществляться поставка данных.

  ```bash
  sudo td-agent-gem install fluent-plugin-kinesis
  ```

## Подключите Fluentd к потоку данных {#connect}

1. На странице созданного потока данных нажмите кнопку **Подключиться** и перейдите на вкладку **Fluentd**.
1. Скопируйте пример файла конфигурации и вставьте его в файл `/etc/td-agent/td-agent.conf`. Вместо `<key_id>` и `<secret>` введите полученные ранее идентификатор и секретный ключ.

  {% cut "Пример файла конфигурации" %}

  ```xml
  <system>
    log_level debug
  </system>
  <source>
    @type http
    @id input_http
    port 8888
  </source>
  <match kinesis>
    @type copy
    <store>
      @type stdout
    </store>
    <store>
      @type kinesis_streams

      aws_key_id <key_id>
      aws_sec_key <secret>

      # kinesis stream name
      stream_name /kz1/b1gia92mbaom********/etnhstu01nin********/my-stream

      # region
      region ru-central-1

      endpoint https://yds.serverless.yandexcloud.net

      <buffer>
        flush_interval 5s
      </buffer>
    </store>
  </match>
  ```

  {% endcut %}

## Проверьте отправку и получение данных {#test-ingestion}

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

```bash
curl --request POST --data 'json={"user_id":"user1", "score": 100}' http://localhost:8888/kinesis
```

Если настройка выполнена успешно, в логе работы Fluentd `/var/log/td-agent/td-agent.log` появятся сообщения о получении данных и записи их в Yandex Data Streams по протоколу AWS Kinesis Data Streams:

```text
...
2022-04-20 19:36:37.770311035 +0000 kinesis: {"user_id":"user1","score":100}
2022-04-20 19:36:42 +0000 [debug]: #0 /kz1/b1gia92mbaom********/etnhstu01nin********/my-stream: Write chunk 5dd1b1ca1bd788e49185aa681e8132b9 /   1 records /    0 KB
2022-04-20 19:36:42 +0000 [debug]: #0 /kz1/b1gia92mbaom********/etnhstu01nin********/my-stream: Finish writing chunk
...
```

В созданном бакете появится файл, который содержит отправленное сообщение.

## Как удалить созданные ресурсы {#clear-out}

Чтобы перестать платить за используемые ресурсы:

1. [Удалите трансфер](../../data-transfer/operations/transfer.md#delete).
1. [Удалите эндпоинты](../../data-transfer/operations/endpoint/index.md#delete).
1. [Удалите поток данных](../../data-streams/operations/manage-streams.md#delete-data-stream).
1. [Удалите бакет](../operations/buckets/delete.md).