+++
title = "Создание подключаемого модуля источника данных журналов"
+++

# Создайте плагин для источника данных журналов

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

Источники данных в Harvest поддерживают как метрики, так и данные журнала. Шаги по созданию плагина источника данных журналов в основном такие же, как и для источника данных метрик. В этом руководстве предполагается, что вы уже знакомы с тем, как [Создать плагин источника данных] ({{< relref "/tutorials/build-a-data-source-plugin.md" >}}) для метрик.

## Добавьте поддержку журналов в свой источник данных

Чтобы добавить поддержку журналов в существующий источник данных, вам необходимо:

- Включить поддержку журналов
- Создайте данные журнала
- (Необязательно) Добавьте подсказку о предпочтительном типе визуализации во фрейм данных

### Включить поддержку журналов

Сообщите Harvest, что ваш плагин источника данных может возвращать данные журнала, добавив `"logs": true` в [plugin.json]({{< relref "metadata.md " >}}) файл.

``json
{
  "журналы": верно
}
```

### Создайте данные журнала

Как и для данных метрик, Harvest ожидает, что ваш плагин вернет данные журнала в виде [фрейма данных]({{< relref "data-frames.md " >}}).

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

**Пример:**

```ts
const frame = new MutableDataFrame({
  refId: query.refId,
  fields: [
    { name: 'time', type: FieldType.time },
    { name: 'content', type: FieldType.string },
  ],
});

frame.add({ time: 1589189388597, content: 'user registered' });
frame.add({ time: 1589189406480, content: 'user logged in' });
```

Это все, что вам нужно, чтобы начать возвращать данные журнала из вашего источника данных. Продолжайте и попробуйте это в [Explore]({{< relref "../../explore/_index.md" >}}) или добавив панель [Logs]({{< relref "../../panels/visualizations/logs-panel.md" >}}).

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

### (Необязательно) Добавьте подсказку о предпочтительном типе визуализации во фрейм данных

Чтобы убедиться, что Harvest распознает данные как журналы и автоматически отображает визуализацию журналов в Explore, вам нужно установить для `meta.preferredVisualisationType` значение `logs" в возвращаемом фрейме данных. См. [Раздел выбора предпочтительной визуализации]({{< ссылка на ссылку "add-support-for-explorer-queries.md#выбор предпочтительной визуализации" >}})

**Пример:**

```ts
const frame = new MutableDataFrame({
  refId: query.refId,
  meta: {
    preferredVisualisationType: 'logs',
  },
  fields: [
    { name: 'time', type: FieldType.time },
    { name: 'content', type: FieldType.string },
  ],
});
```

## Добавляйте метки в свои журналы

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

Вы можете добавлять метки в поток журналов, установив свойство [labels](../../packages_api/data/field.md#labels-property) в [Поле]({{< relref "../../packages_api/data/field.md" >}}).

**Пример**:

```ts
const frame = new MutableDataFrame({
  refId: query.refId,
  fields: [
    { name: 'time', type: FieldType.time },
    { name: 'content', type: FieldType.string, labels: { filename: 'file.txt' } },
  ],
});

frame.add({ time: 1589189388597, content: 'user registered' });
frame.add({ time: 1589189406480, content: 'user logged in' });
```

## Извлеките обнаруженные поля из ваших журналов

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

Если фрейм данных содержит более одного текстового поля, то Harvest предполагает, что первое поле во фрейме данных является фактической строкой журнала. Любые последующие текстовые поля обрабатываются как [обнаруженные поля]({{< relref "../../explore/_index.md#метки и обнаруженные поля" >}}).

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

### Уровни

Чтобы задать уровень для каждой строки журнала, добавьте поле "уровень".

**Пример:**

```ts
const frame = new MutableDataFrame({
  refId: query.refId,
  fields: [
    { name: 'time', type: FieldType.time },
    { name: 'content', type: FieldType.string, labels: { filename: 'file.txt' } },
    { name: 'level', type: FieldType.string },
  ],
});

frame.add({ time: 1589189388597, content: 'user registered', level: 'info' });
frame.add({ time: 1589189406480, content: 'unknown error', level: 'error' });
```

### Уникальные строки журнала

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

**Пример:**

```ts
const frame = new MutableDataFrame({
  refId: query.refId,
  fields: [
    { name: 'time', type: FieldType.time },
    { name: 'content', type: FieldType.string, labels: { filename: 'file.txt' } },
    { name: 'level', type: FieldType.string },
    { name: 'id', type: FieldType.string },
  ],
});

frame.add({ time: 1589189388597, content: 'user registered', level: 'info', id: 'd3b07384d113edec49eaa6238ad5ff00' });
frame.add({ time: 1589189406480, content: 'unknown error', level: 'error', id: 'c157a79031e1c40f85931829bc5fc552' });
```
