Команды обработки логов: различия между версиями
Нет описания правки |
|||
| Строка 1: | Строка 1: | ||
Определение правила обработки состоит из последовательности команд обработки слева направо | = Команды обработки логов = | ||
Команды обработки логов и событий представляют собой операторы и предложения '''DQL'''. Определение правила позволяет задать последовательность команд для достижения нужной цели правила обработки. Определение правила обработки состоит из последовательности команд обработки, соединённых слева направо символом вертикальной черты (<code>|</code>). Концептуально это похоже на конвейер команд Unix, где вывод команды слева от символа <code>|</code> становится вводом для команды справа. Пайплайн всегда должен начинаться с команды, создающей структурированный поток данных для последующих команд. | |||
== PARSE == | |||
Команда <code>PARSE</code> | Команда <code>PARSE</code> разбирает выбранное поле с помощью заданного выражения-шаблона ('''Язык шаблонов Ключ-АСТРОМ'''), дополняя запись лога экспортированными значениями. | ||
=== Примеры === | |||
== USING == | |||
Команда <code>USING</code> задаёт входные данные для данной трансформации, перечисляя поля с опциями, которые могут быть переданы из входящего события в трансформацию. Эта команда должна быть первой командой, используемой в определении процессора. | |||
'''Формат объявления полей:''' <code>USING(<field_expression>, <field_expression>, ...)</code> | |||
Формат | '''Формат выражения поля:''' <code>[IN|INOUT] name: [type[]?]</code> | ||
Команда <code>USING</code> в определении процессора эквивалентна оператору <code>USING(IN content:STRING)</code>. | |||
'''Опции:''' | |||
* <code>IN</code> — поле только для чтения, опция по умолчанию. | |||
* <code>INOUT</code> — записываемое поле. | |||
* <code>type</code> — один из следующих типов: <code>STRING</code>, <code>BOOLEAN</code>, <code>INTEGER</code>, <code>LONG</code>, <code>DOUBLE</code>, <code>DURATION</code>, <code>TIMESTAMP</code>, <code>IPADDR</code>. | |||
* <code>[]</code> — помечает поле как массив, что означает, что будет передано несколько значений атрибута. | |||
* <code>?</code> — помечает поле как необязательное, что означает, что трансформация будет выполнена, даже если такого атрибута нет в событии. | |||
'''Пример:''' <code>USING(content, event.type:STRING?, INOUT attribute:INT[]) | ...</code> | |||
В этом случае три поля передаются из входящего события в трансформацию: | |||
В этом случае из входящего события в | |||
* <code>content</code> — строковое поле только для чтения | |||
* <code>event.type</code> — необязательное строковое поле только для чтения | |||
* <code>attribute</code> — записываемый массив целых чисел | |||
== FIELDS_ADD == | |||
Команда <code>FIELDS_ADD</code> задаёт разделённый запятыми список литералов, функций, имён полей и выражений для вычисления. | |||
'''Формат:''' <code>FIELDS_ADD( [ alias':' ] { * | alias.* | '@'position | function | expression | literal } [ , ... ])</code> | |||
Каждое выражение можно переименовать с помощью псевдонима. Псевдонимы, | Каждое выражение можно переименовать с помощью псевдонима. Псевдонимы, определённые в команде select, можно использовать в последующих командах пайплайна. | ||
=== Пример === | |||
В следующем примере мы вычисляем сумму <code>field1</code>и <code>field2</code>и помещаем результат в поле с именем <code>mySum</code>. | В следующем примере мы вычисляем сумму <code>field1</code> и <code>field2</code> и помещаем результат в поле с именем <code>mySum</code>. | ||
{| class="wikitable" | {| class="wikitable" | ||
!field1 | |||
!field2 | |||
|- | |- | ||
|300 | |300 | ||
|650 | |650 | ||
|} | |} | ||
<code>FIELDS_ADD(mySum:(field1 + field2))</code> | |||
{| class="wikitable" | {| class="wikitable" | ||
!field1 | |||
!field2 | |||
!mySum | |||
|- | |- | ||
|300 | |300 | ||
| Строка 92: | Строка 60: | ||
|} | |} | ||
== FIELDS_RENAME == | |||
Команда <code>FIELDS_RENAME</code> переименовывает указанные поля записи. Она сохраняет порядок полей и другие поля. | Команда <code>FIELDS_RENAME</code> переименовывает указанные поля записи. Она сохраняет порядок полей и другие поля. | ||
Формат: <code>FIELDS_RENAME(newName:field, name2:field2, ...)</code> | '''Формат:''' <code>FIELDS_RENAME(newName:field, name2:field2, ...)</code> | ||
=== Пример === | |||
В следующем примере мы переименовываем поле <code>ip</code> в <code>src_addr</code> | В следующем примере мы переименовываем поле <code>ip</code> в <code>src_addr</code>, а поле <code>f</code> — в <code>value</code>. | ||
{| class="wikitable" | {| class="wikitable" | ||
!t | |||
!ip | |||
!s | |||
!f | |||
|- | |- | ||
|2020-09-23 15:14:42.947 +0300 | |2020-09-23 15:14:42.947 +0300 | ||
| Строка 110: | Строка 78: | ||
|0.0 | |0.0 | ||
|} | |} | ||
<code>FIELDS_RENAME(src_addr:ip, value:f)</code> | |||
{| class="wikitable" | {| class="wikitable" | ||
!t | |||
!src_addr | |||
!s | |||
!value | |||
|- | |- | ||
|2020-09-23 15:14:42.947 +0300 | |2020-09-23 15:14:42.947 +0300 | ||
| Строка 125: | Строка 91: | ||
|} | |} | ||
== | == FIELDS_REMOVE == | ||
Команда <code>FIELDS_REMOVE</code> удаляет указанные поля из выходного потока. Команда полезна в | Команда <code>FIELDS_REMOVE</code> удаляет указанные поля из выходного потока. Команда полезна в сценариях, исключающих конфиденциальные поля. | ||
'''Формат:''' <code>FIELDS_REMOVE(field, field, ...)</code> | |||
=== Пример === | |||
В следующем примере мы добавляем поля <code>t</code>, <code>ip</code>, <code>s</code> и <code>f</code>. Затем мы удаляем поля <code>s</code> и <code>ip</code>, оставляя нам поля <code>t</code> и <code>f</code>. | |||
<code>FIELDS_REMOVE(s, ip)</code> | |||
{| class="wikitable" | {| class="wikitable" | ||
!t | |||
!f | |||
|- | |- | ||
|2020-09-23 15:17:39.497 +0300 | |2020-09-23 15:17:39.497 +0300 | ||
| Строка 149: | Строка 114: | ||
|} | |} | ||
== FILTER_OUT == | |||
Команда <code>FILTER_OUT</code> отбрасывает всю запись, используя выражение, возвращающее логическое значение (boolean_expression). Это команда | Команда <code>FILTER_OUT</code> отбрасывает всю запись, используя выражение, возвращающее логическое значение (<code>boolean_expression</code>). Это команда отрицательной фильтрации. Она может состоять из нескольких логических выражений, объединённых операторами <code>AND</code>, <code>OR</code> и <code>NOT</code>. Если условие выполнено, вся запись отбрасывается и не передаётся на следующую стадию. | ||
Например, можно отбросить все записи с уровнем лога <code>DEBUG</code> или <code>debug</code>. | |||
'''Формат:''' <code>FILTER_OUT(loglevel IN ['DEBUG', 'debug'])</code> | |||
=== Примеры === | |||
* В следующем примере мы отбрасываем записи, где <code>_raw_text</code> (исходный текст необработанной записи) содержит строку <code>vpns</code> или <code>_raw_text</code> равно NULL: | |||
<code>FILTER_OUT(contains(_raw_text, '/vpns/'))</code> | |||
* В следующем примере мы отбрасываем записи, где строковое поле <code>type</code> равно <code>logout</code> или <code>type</code> равно NULL: | |||
<code>FILTER_OUT(type = 'logout')</code> | |||
* В следующем примере мы отбрасываем записи, где поле временной метки <code>last_modified</code> больше 7 дней назад или <code>last_modified</code> равно NULL: | |||
<code>FILTER_OUT(last_modified >= now()[-7 day])</code> | |||
Текущая версия от 18:21, 13 октября 2026
Команды обработки логов
Команды обработки логов и событий представляют собой операторы и предложения DQL. Определение правила позволяет задать последовательность команд для достижения нужной цели правила обработки. Определение правила обработки состоит из последовательности команд обработки, соединённых слева направо символом вертикальной черты (|). Концептуально это похоже на конвейер команд Unix, где вывод команды слева от символа | становится вводом для команды справа. Пайплайн всегда должен начинаться с команды, создающей структурированный поток данных для последующих команд.
PARSE
Команда PARSE разбирает выбранное поле с помощью заданного выражения-шаблона (Язык шаблонов Ключ-АСТРОМ), дополняя запись лога экспортированными значениями.
Примеры
USING
Команда USING задаёт входные данные для данной трансформации, перечисляя поля с опциями, которые могут быть переданы из входящего события в трансформацию. Эта команда должна быть первой командой, используемой в определении процессора.
Формат объявления полей: USING(<field_expression>, <field_expression>, ...)
Формат выражения поля: [IN|INOUT] name: [type[]?]
Команда USING в определении процессора эквивалентна оператору USING(IN content:STRING).
Опции:
IN— поле только для чтения, опция по умолчанию.INOUT— записываемое поле.type— один из следующих типов:STRING,BOOLEAN,INTEGER,LONG,DOUBLE,DURATION,TIMESTAMP,IPADDR.[]— помечает поле как массив, что означает, что будет передано несколько значений атрибута.?— помечает поле как необязательное, что означает, что трансформация будет выполнена, даже если такого атрибута нет в событии.
Пример: USING(content, event.type:STRING?, INOUT attribute:INT[]) | ...
В этом случае три поля передаются из входящего события в трансформацию:
content— строковое поле только для чтенияevent.type— необязательное строковое поле только для чтенияattribute— записываемый массив целых чисел
FIELDS_ADD
Команда FIELDS_ADD задаёт разделённый запятыми список литералов, функций, имён полей и выражений для вычисления.
Формат: FIELDS_ADD( [ alias':' ] { * | alias.* | '@'position | function | expression | literal } [ , ... ])
Каждое выражение можно переименовать с помощью псевдонима. Псевдонимы, определённые в команде select, можно использовать в последующих командах пайплайна.
Пример
В следующем примере мы вычисляем сумму field1 и field2 и помещаем результат в поле с именем mySum.
| field1 | field2 |
|---|---|
| 300 | 650 |
FIELDS_ADD(mySum:(field1 + field2))
| field1 | field2 | mySum |
|---|---|---|
| 300 | 650 | 950 |
FIELDS_RENAME
Команда FIELDS_RENAME переименовывает указанные поля записи. Она сохраняет порядок полей и другие поля.
Формат: FIELDS_RENAME(newName:field, name2:field2, ...)
Пример
В следующем примере мы переименовываем поле ip в src_addr, а поле f — в value.
| t | ip | s | f |
|---|---|---|---|
| 2020-09-23 15:14:42.947 +0300 | 0.0.0.0 | 0ho0 | 0.0 |
FIELDS_RENAME(src_addr:ip, value:f)
| t | src_addr | s | value |
|---|---|---|---|
| 2020-09-23 15:14:42.947 +0300 | 0.0.0.0 | 0ho0 | 0.0 |
FIELDS_REMOVE
Команда FIELDS_REMOVE удаляет указанные поля из выходного потока. Команда полезна в сценариях, исключающих конфиденциальные поля.
Формат: FIELDS_REMOVE(field, field, ...)
Пример
В следующем примере мы добавляем поля t, ip, s и f. Затем мы удаляем поля s и ip, оставляя нам поля t и f.
FIELDS_REMOVE(s, ip)
| t | f |
|---|---|
| 2020-09-23 15:17:39.497 +0300 | 0.0 |
| 2020-09-23 15:17:39.498 +0300 | 1.0 |
| 2020-09-23 15:17:39.499 +0300 | 2.0 |
FILTER_OUT
Команда FILTER_OUT отбрасывает всю запись, используя выражение, возвращающее логическое значение (boolean_expression). Это команда отрицательной фильтрации. Она может состоять из нескольких логических выражений, объединённых операторами AND, OR и NOT. Если условие выполнено, вся запись отбрасывается и не передаётся на следующую стадию.
Например, можно отбросить все записи с уровнем лога DEBUG или debug.
Формат: FILTER_OUT(loglevel IN ['DEBUG', 'debug'])
Примеры
- В следующем примере мы отбрасываем записи, где
_raw_text(исходный текст необработанной записи) содержит строкуvpnsили_raw_textравно NULL:
FILTER_OUT(contains(_raw_text, '/vpns/'))
- В следующем примере мы отбрасываем записи, где строковое поле
typeравноlogoutилиtypeравно NULL:
FILTER_OUT(type = 'logout')
- В следующем примере мы отбрасываем записи, где поле временной метки
last_modifiedбольше 7 дней назад илиlast_modifiedравно NULL:
FILTER_OUT(last_modified >= now()[-7 day])