Функции разбора

В данной статье при описании функций приняты следующие обозначения:

  • Типы значений, которые принимает аргумент, указаны в угловых скобках.

  • Перечень необязательных аргументов заключается в квадратные скобки. При вызове функции квадратные скобки вводить не нужно.

  • После :: в угловых скобках указаны типы значений, которые возвращает функция.

Функции разбора согласно регулярному выражению

parse_regex

Разбирает строку value с использованием предоставленного регулярного выражения pattern. Эта функция отличается от функции parse_regex_all тем, что ищет только первое совпадение.

Функция возвращает объект с полями, соответствующими именованным группам. При включенной опции numeric_groups объект также включает поля, ключи которых являются последовательными номерами:

  • поле "0" содержит совпадение полностью;

  • последующие поля содержат захваченные группы по порядку.

Спецификация функции

parse_regex(value: <строка>, pattern: <регулярное выражение>, [numeric_groups: <логическое значение>])
:: <объект>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для поиска.

да

pattern

регулярное выражение

Регулярное выражение для поиска.

да

numeric_groups

логическое значение

Если true, будет возвращаться каждая захваченная группа в регулярном выражении. Индекс 0 будет содержать совпадение полностью.

false

нет

Примечания

Эта функция имеет особое поведение, о котором следует знать.

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

  • Если в pattern нет именованных групп и значение numeric_groups равно false, функция возвращает пустой объект.

  • Все значения возвращаются как строки. Рекомендуется преобразовывать значения в нужные типы, используя соответствующие функции.

Ошибки

Функция parse_regex может возвращать ошибки, для которых требуется обработка:

  • Строку value не удалось разобрать с использованием предоставленного шаблона pattern.

Примеры

Разбор с использованием регулярного выражения (с захватом именованной группы)

Пример 1. Исходный код
parse_regex!("Connection attempt from 192.0.2.0, from 192.0.2.1.",
r'from (?P<ip>\d+\.\d+\.\d+\.\d+)')
Пример 2. Результат
{
  "ip": "192.0.2.0"
}

Разбор с использованием регулярного выражения (без захвата именованных групп)

Пример 3. Исходный код
parse_regex!("Connection attempt from 192.0.2.0, from 192.0.2.1.",
r'from (\d+\.\d+\.\d+\.\d+)',
numeric_groups: true)
Пример 4. Результат
{
  "0": "from 192.0.2.0",
  "1": "192.0.2.0"
}

parse_regex_all

Разбирает value с использованием предоставленного регулярного выражения pattern. Эта функция отличается от функции parse_regex тем, что ищет все совпадения, а не только первое.

Функция возвращает массив объектов с полями, соответствующими именованным группам. При включенной опции numeric_groups объекты также включают поля, ключи которых являются последовательными номерами:

  • поле "0" содержит совпадение полностью;

  • последующие поля содержат захваченные группы по порядку.

Спецификация функции

parse_regex_all(value: <строка>, pattern: <регулярное выражение>, [numeric_groups: <логическое значение>])
:: <массив> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для поиска.

да

pattern

регулярное выражение

Регулярное выражение для поиска.

да

numeric_groups

логическое значение

Если true, будет возвращаться каждая захваченная группы в регулярном выражении. Индекс 0 будет содержать совпадение полностью.

false

нет

Примечания

Эта функция имеет особое поведение, о котором следует знать.

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

  • Если в pattern нет именованных групп и значение numeric_groups равно false, функция возвращает массив пустых объектов.

  • Все значения возвращаются как строки. Рекомендуется преобразовывать значения в нужные типы, используя соответствующие функции.

Ошибки

Функция parse_regex_all может возвращать ошибки, для которых требуется обработка:

  • value не удалось разобрать с использованием предоставленного шаблона pattern.

Примеры

Разбор с использованием регулярного выражения (все совпадения)

Пример 5. Исходный код
parse_regex_all!("Connection attempt from 192.0.2.0, from 192.0.2.1.",
r'from (?P<ip>\d+\.\d+\.\d+\.\d+)',
numeric_groups: true)
Пример 6. Результат
[
  {
    "0": "from 192.0.2.0",
    "1": "192.0.2.0",
    "ip": "192.0.2.0"
  },
  {
    "0": "from 192.0.2.1",
    "1": "192.0.2.1",
    "ip": "192.0.2.1"
  }
]

Функции разбора форматов логов

parse_apache_log

Разбирает строки журнала доступа и ошибок Apache. Строки могут иметь формат common, combined или error.

Спецификация функции

parse_apache_log(value: <строка>, format: <строка>, [timestamp_format: <строка>])
:: <объект>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для разбора.

да

format

строка

Формат, используемый для разбора журнала.

да

timestamp_format

строка

Формат даты/времени, используемый для кодирования метки времени. Время разбирается в локальном часовом поясе, если метка времени не указывает часовой пояс.

%d/%b/%Y:%T %z

нет

Примечания

У этой функции есть особое поведение, о котором следует знать:

  • Отсутствие информации в сообщении журнала может быть обозначено -. Эти поля опущены в результате.

Ошибки

Функция parse_apache_log может возвращать ошибки, для которых требуется обработка:

  • value не соответствует указанному формату.

  • timestamp_format не является допустимой строкой формата.

  • Метку времени в value не удалось разобрать с использованием предоставленного timestamp_format.

Примеры

Разбор строки в формате журнала Apache (common)

Пример 7. Исходный код
parse_apache_log!("192.0.2.0 bob frank [10/Oct/2000:13:55:36 -0700] \"GET /apache_pb.gif HTTP/1.0\" 200 2326",
format: "common")
Пример 8. Результат
{
  "host": "192.0.2.0",
  "identity": "bob",
  "message": "GET /apache_pb.gif HTTP/1.0",
  "method": "GET",
  "path": "/apache_pb.gif",
  "protocol": "HTTP/1.0",
  "size": 2326,
  "status": 200,
  "timestamp": "2000-10-10T20:55:36Z",
  "user": "frank"
}

Разбор строки в формате журнала Apache (combined)

Пример 9. Исходный код
parse_apache_log!(
s'192.0.2.0 bob frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/vertical/channels/front-end/bandwidth" "Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/1945-10-12 Firefox/37.0"',
"combined")
Пример 10. Результат
{
  "agent": "Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/1945-10-12 Firefox/37.0",
  "host": "192.0.2.0",
  "identity": "bob",
  "message": "GET /apache_pb.gif HTTP/1.0",
  "method": "GET",
  "path": "/apache_pb.gif",
  "protocol": "HTTP/1.0",
  "referrer": "http://www.example.com/vertical/channels/front-end/bandwidth",
  "size": 2326,
  "status": 200,
  "timestamp": "2000-10-10T20:55:36Z",
  "user": "frank"
}

Разбор строки в формате журнала Apache (ошибка)

Пример 11. Исходный код
parse_apache_log!(
s'[01/Mar/2021:12:00:19 +0000] [ab:alert] [pid 4803:tid 3814] [client 147.159.108.175:24259] I will bypass the haptic COM bandwidth, that should matrix the CSS driver!',
"error")
Пример 12. Результат
{
  "client": "147.159.108.175",
  "message": "I will bypass the haptic COM bandwidth, that should matrix the CSS driver!",
  "module": "ab",
  "pid": 4803,
  "port": 24259,
  "severity": "alert",
  "thread": "3814",
  "timestamp": "2021-03-01T12:00:19Z"
}

rv_parse_avro

Разбирает value как файл формата Apache Avro, который содержит метаданные со схемой. Если сообщение не содержит схемы, используйте функцию rv_parse_avro_raw.

Спецификация функции

rv_parse_avro(value: <строка>, [reader_schema: <строка>])
:: <массив объектов>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строковое представление сообщения Avro

да

reader_schema

JSON

Схема для считывания в формате JSON.

Строка должна быть представлена литералом, без использования переменных.

нет

Примечания

Особенности функции, о которых нужно знать:

  • Использование схемы считывания (параметр reader_schema) может замедлить выполнение функции.

  • Тип Decimal в сообщениях Avro не поддерживается.

Ошибки

Функция rv_parse_avro может возвращать ошибки, для которых требуется обработка:

  • value не является корректным сообщением Avro;

  • value закодировано не в UTF-8;

  • reader_schema не является строкой;

  • невозможно разобрать предоставленную reader_schema;

  • значения типов TimeMicros, TimeMillis, Float и Double в разобранном сообщении не являются числовыми.

Примеры

Базовый разбор

Пример 13. Исходный код
# .message -- путь к сообщению в формате Avro
rv_parse_avro!(.message)
Пример 14. Результат
# пример массива объектов
[
  {
    "entity": "001",
    "time": "1433269388"
  },
  {
    "entity": "002",
    "time": "1433270488"
  },
]

С указанием схемы

Пример 15. Исходный код
# .message -- путь к сообщению в формате Avro
rv_parse_avro!(.message,
reader_schema: s'{"type": "record", "fields": [{"name": "element", "type": "string"}, {"name": "time", "type": "string"}]}')
Пример 16. Результат
# пример массива объектов
[
  {
    "element": "001",
    "time": "1433269388"
  },
  {
    "element": "002",
    "time": "1433270488"
  },
]

rv_parse_avro_raw

Разбирает value как отдельную запись Apache Avro, сериализованную без заголовков или встроенной схемы. Функция требует предоставлять схему расшифровки данных.

Спецификация функции

rv_parse_avro_raw(value: <строка>, decoder_schema: <avro_schema>, [reader_schema: <строка>])
:: <объект>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строковое представление сообщения Avro

да

decoder_schema

строка

Схема для расшифровки данных.

Строка должна быть представлена литералом, без использования переменных.

да

reader_schema

JSON

Схема в формате JSON для валидации расшифрованных данных.

Строка должна быть представлена литералом, без использования переменных.

нет

Примечания

Особенности функции, о которых нужно знать:

  • Использование схемы считывания (параметр reader_schema) может замедлить выполнение функции.

  • Тип Decimal в сообщениях Avro не поддерживается.

Ошибки

Функция rv_parse_avro_raw может возвращать ошибки, для которых требуется обработка:

  • value не является корректным сообщением Avro;

  • decoder_schema не является строкой;

  • reader_schema не является строкой;

  • невозможно разобрать предоставленную decoder_schema;

  • невозможно разобрать предоставленную reader_schema;

  • значения типов TimeMicros, TimeMillis, Float и Double в разобранном сообщении не являются числовыми.

Примеры

Базовый разбор

Пример 17. Исходный код
# .message -- путь к сообщению в формате Avro
rv_parse_avro_raw!(.message,
decoder_schema: s'{"type": "record", "fields": [{"name": "element", "type": "string"}, {"name": "time", "type": "string"}]}')
Пример 18. Результат
# пример объекта
{
  "element": "value",
  "time": "1433270488"
}

С указанием схемы считывания

Пример 19. Исходный код
# .message -- путь к сообщению в формате Avro
rv_parse_avro_raw!(.message,
decoder_schema: s'{"type": "record", "fields": [{"name": "element", "type": "string"}, {"name": "time", "type": "string"}]}',
reader_schema: s'{"type": "record", "fields": [{"name": "element", "type": "string"}]}')
Пример 20. Результат
# пример объекта
{
  "element": "value"
}

parse_aws_alb_log

Разбирает value в формате журнала доступа Application Load Balancer в AWS (Amazon Web Services).

Спецификация функции

parse_aws_alb_log(value: <строка>)
:: <объект>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Журнал доступа Application Load Balancer.

да

Ошибки

Функция parse_aws_alb_log может возвращать ошибки, для которых требуется обработка:

  • value не соответствует указанному формату лога AWS ALB.

Примеры

Разбор лога AWS ALB

Пример 21. Исходный код
parse_aws_alb_log!(
"http 2018-11-30T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 192.168.131.39:2817 - 0.000 0.001 0.000 200 200 34 366 \"GET http://www.example.com:80/ HTTP/1.1\" \"curl/7.46.0\" - - arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 \"Root=1-58337364-23a8c76965a2ef7629b185e3\" \"-\" \"-\" 0 2018-11-30T22:22:48.364000Z \"forward\" \"-\" \"-\" \"-\" \"-\" \"-\" \"-\""
)
Пример 22. Результат
{
  "actions_executed": "forward",
  "chosen_cert_arn": null,
  "classification": null,
  "classification_reason": null,
  "client_host": "192.168.131.39:2817",
  "domain_name": null,
  "elb": "app/my-loadbalancer/50dc6c495c0c9188",
  "elb_status_code": "200",
  "error_reason": null,
  "matched_rule_priority": "0",
  "received_bytes": 34,
  "redirect_url": null,
  "request_creation_time": "2018-11-30T22:22:48.364000Z",
  "request_method": "GET",
  "request_processing_time": 0,
  "request_protocol": "HTTP/1.1",
  "request_url": "http://www.example.com:80/",
  "response_processing_time": 0,
  "sent_bytes": 366,
  "ssl_cipher": null,
  "ssl_protocol": null,
  "target_group_arn": "arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
  "target_host": null,
  "target_port_list": [],
  "target_processing_time": 0.001,
  "target_status_code": "200",
  "target_status_code_list": [],
  "timestamp": "2018-11-30T22:23:00.186641Z",
  "trace_id": "Root=1-58337364-23a8c76965a2ef7629b185e3",
  "traceability_id": null,
  "type": "http",
  "user_agent": "curl/7.46.0"
}

parse_aws_cloudwatch_log_subscription_message

Разбирает события журналов AWS CloudWatch, настроенных через подписки Cloudwatch, из источника aws_kinesis_firehose.

Спецификация функции

parse_aws_cloudwatch_log_subscription_message(value: <строка>)
:: <объект>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строковое представление сообщения для разбора.

да

Ошибки

Функция parse_aws_cloudwatch_log_subscription_message может возвращать ошибки, для которых требуется обработка:

  • value не является правильно отформатированным сообщением подписки AWS Cloudwatch Log.

Примеры

Разбор сообщения подписки AWS Cloudwatch Log

Пример 23. Исходный код
# .message -- пример пути к сообщению журнала AWS CloudWatch
parse_aws_cloudwatch_log_subscription_message!(.message)
Пример 24. Результат
{
  "log_events": [
    {
      "id": "35683658089614582423604394983260738922885519999578275840",
      "message": "{\"bytes\":26780,\"datetime\":\"14/Sep/2020:11:45:41 -0400\",\"host\":\"192.0.2.1\",\"method\":\"PUT\",\"protocol\":\"HTTP/1.0\",\"referer\":\"https://www.principalcross-platform.io/markets/ubiquitous\",\"request\":\"/expedite/convergence\",\"source_type\":\"stdin\",\"status\":301,\"user-identifier\":\"-\"}",
      "timestamp": "2020-09-14T19:09:29.039Z"
    }
  ],
  "log_group": "test",
  "log_stream": "test",
  "message_type": "DATA_MESSAGE",
  "owner": "111111111111",
  "subscription_filters": [
    "Destination"
  ]
}

parse_aws_vpc_flow_log

Разбирает value в формате журналов потокового контроля AWS Virtual Private Cloud (VPC Flow Logs).

Спецификация функции

parse_aws_vpc_flow_log(value: <строка>, [format: <строка>])
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Журнал потоков VPC.

да

format

строка

Формат журнала потоков VPC.

нет

Ошибки

Функция parse_aws_vpc_flow_log может возвращать ошибки, для которых требуется обработка:

  • value имеет неправильный формат журнала потоков VPC AWS.

Примеры

Разбор журнала потоков VPC AWS (формат по умолчанию)

Пример 25. Исходный код
parse_aws_vpc_flow_log!("2 123456789010 eni-1235b8ca123456789 - - - - - - - 1431280876 1431280934 - NODATA")
Пример 26. Результат
{
  "account_id": "123456789010",
  "action": null,
  "bytes": null,
  "dstaddr": null,
  "dstport": null,
  "end": 1431280934,
  "interface_id": "eni-1235b8ca123456789",
  "log_status": "NODATA",
  "packets": null,
  "protocol": null,
  "srcaddr": null,
  "srcport": null,
  "start": 1431280876,
  "version": 2
}

Разбор журнала потоков VPC AWS (пользовательский формат)

Пример 27. Исходный код
parse_aws_vpc_flow_log!(
"- eni-1235b8ca123456789 10.0.1.5 10.0.0.220 10.0.1.5 203.0.113.5",
"instance_id interface_id srcaddr dstaddr pkt_srcaddr pkt_dstaddr"
)
Пример 28. Результат
{
  "dstaddr": "10.0.0.220",
  "instance_id": null,
  "interface_id": "eni-1235b8ca123456789",
  "pkt_dstaddr": "203.0.113.5",
  "pkt_srcaddr": "10.0.1.5",
  "srcaddr": "10.0.1.5"
}

parse_cef

Разбирает value в формате CEF (Common Event Format). Игнорирует все данные до заголовка CEF.

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

Спецификация функции

parse_cef(value: <строка>, [translate_custom_fields: <логическое значение>])
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для разбора

да

translate_custom_fields

логическое значение

Преобразовывать пользовательские пары полей в формат ключ: значение

false

нет

Примечания

У этой функции есть специальное поведение, которое следует учитывать:

  • Все значения возвращаются как строки. Рекомендуется преобразовывать значения в нужные типы, используя соответствующие функции.

  • Обрамляющие кавычки удаляются из значений.

  • Пустые значения возвращаются как пустые строки.

Ошибки

Функция parse_cef может возвращать ошибки, для которых требуется обработка:

  • value имеет неправильный формат строки CEF.

Примеры

Разбор сообщения, сгенерированного Privileged Threat Analytics (PTA)

Пример 29. Исходный код
parse_cef!(
"CEF:0|CyberArk|PTA|12.6|1|Suspected credentials theft|8|suser=mike2@prod1.example.com shost=prod1.example.com src=198.51.100.0 duser=andy@dev1.example.com dhost=dev1.example.com dst=203.0.113.0 cs1Label=ExtraData cs1=None cs2Label=EventID cs2=52b06812ec3500ed864c461e deviceCustomDate1Label=detectionDate deviceCustomDate1=1388577900000 cs3Label=PTAlink cs3=https://198.51.100.0/incidents/52b06812ec3500ed864c461e cs4Label=ExternalLink cs4=None"
)
Пример 30. Результат
{
  "cefVersion": "0",
  "cs1": "None",
  "cs1Label": "ExtraData",
  "cs2": "52b06812ec3500ed864c461e",
  "cs2Label": "EventID",
  "cs3": "https://198.51.100.0/incidents/52b06812ec3500ed864c461e",
  "cs3Label": "PTAlink",
  "cs4": "None",
  "cs4Label": "ExternalLink",
  "deviceCustomDate1": "1388577900000",
  "deviceCustomDate1Label": "detectionDate",
  "deviceEventClassId": "1",
  "deviceProduct": "PTA",
  "deviceVendor": "CyberArk",
  "deviceVersion": "12.6",
  "dhost": "dev1.example.com",
  "dst": "203.0.113.0",
  "duser": "andy@dev1.example.com",
  "name": "Suspected credentials theft",
  "severity": "8",
  "shost": "prod1.example.com",
  "src": "198.51.100.0",
  "suser": "mike2@prod1.example.com"
}

Сообщение с заголовком syslog, которое игнорируется

Пример 31. Исходный код
parse_cef!(
"Sep 29 08:26:10 host CEF:1|Security|threatmanager|1.0|100|worm successfully stopped|10|src=198.51.100.0 dst=203.0.113.0 spt=1232"
)
Пример 32. Результат
{
  "cefVersion": "1",
  "deviceVendor": "Security",
  "deviceProduct": "threatmanager",
  "deviceVersion": "1.0",
  "deviceEventClassId": "100",
  "name": "worm successfully stopped",
  "severity": "10",
  "src": "198.51.100.0",
  "dst": "203.0.113.0",
  "spt": "1232"
}

Преобразование пользовательских полей

Пример 33. Исходный код
parse_cef!(
"CEF:0|Dev|firewall|2.2|1|Connection denied|5|c6a1=2001:0DB8:2CA1:0000:0000:0567:5673:23b5 c6a1Label=Device IPv6 Address",
translate_custom_fields: true
)
Пример 34. Результат
{
  "cefVersion": "0",
  "deviceVendor": "Dev",
  "deviceProduct": "firewall",
  "deviceVersion": "2.2",
  "deviceEventClassId": "1",
  "name": "Connection denied",
  "severity": "5",
  "Device IPv6 Address": "2001:0DB8:2CA1:0000:0000:0567:5673:23b5"
}

rv_parse_cef

Разбирает value в формате Common Event Format (CEF). Поддерживает и обрабатывает необязательный заголовок syslog.

Спецификация функции

rv_parse_cef(value: <строка>)
:: <объект>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строковое представление записи CEF

да

Ошибки

Функция rv_parse_cef может возвращать ошибки, для которых требуется обработка:

  • строка value не начинается с обязательного префикса CEF:;

  • строка value не содержит обязательных полей и не является корректной записью CEF.

Примеры

Базовый разбор

Пример 35. Исходный код
rv_parse_cef!(s'CEF:0|Microsoft|Microsoft Windows||Microsoft-Windows-Security-Auditing:4624|An account was successfully logged on.|Low| eventId=1013540004 externalId=4624')
Пример 36. Результат
{
  "deviceVendor": "Microsoft",
  "deviceProduct": "Microsoft Windows",
  "deviceVersion": "",
  "deviceEventClassId": "Microsoft-Windows-Security-Auditing:4624",
  "name": "An account was successfully logged on.",
  "severity": "Low",
  "eventId": "1013540004",
  "externalId": "4624"
}

Сообщение с заголовком syslog

Пример 37. Исходный код
value = r#"<134>1 2022-02-14T03:17:30-08:00 TEST CEF:0|Vendor|Product|20.0.560|600|User Signed In|3|src=192.0.2.255 "#
rv_parse_cef!(value)
Пример 38. Результат
{
  ahost: "TEST",
  at: "2022-02-14T03:17:30-08:00",
  deviceProduct: "Product",
  deviceVendor: "Vendor",
  deviceVersion: "20.0.560",
  name: "User Signed In",
  severity: "3",
  signatureId: "600",
  src: "192.0.2.255",
  syslog_facility: "16",
  syslog_priority: "134",
  syslog_severity: "6",
})

parse_common_log

Разбирает value с использованием формата общего журнала Apache (Common Log Format, CLF).

Спецификация функции

parse_common_log(value: <строка>, [timestamp_format: <строка>])
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для разбора.

да

timestamp_format

строка

Формат даты и времени для кодирования метки времени.

%d/%b/%Y:%T %z

нет

Примечания

У этой функции есть специальное поведение, которое следует учитывать:

  • Отсутствующая информация в журнальной записи может быть обозначена символом -. Эти поля опускаются в результате.

Ошибки

Функция parse_common_log может возвращать ошибки, для которых требуется обработка:

  • value не соответствует формату общего журнала.

  • timestamp_format не является допустимой строкой формата.

  • Метку времени в value не удается разобрать с использованием предоставленного timestamp_format.

Примеры

Разбор сообщения в формате общего журнала (с форматом метки времени по умолчанию)

Пример 39. Исходный код
parse_common_log!("192.0.2.2 bob frank [10/Oct/2000:13:55:36 -0700] \"GET /apache_pb.gif HTTP/1.0\" 200 2326")
Пример 40. Результат
{
  "host": "192.0.2.2",
  "identity": "bob",
  "user": "frank",
  "timestamp": "2000-10-10T20:55:36Z",
  "message": "GET /apache_pb.gif HTTP/1.0",
  "method": "GET",
  "path": "/apache_pb.gif",
  "protocol": "HTTP/1.0",
  "status": 200,
  "size": 2326
}

Разбор сообщения в формате общего журнала с пользовательским форматом метки времени

Пример 41. Исходный код
parse_common_log!(
"192.0.2.25 bob frank [2000-10-10T20:55:36Z] \"GET /apache_pb.gif HTTP/1.0\" 200 2326",
"%+"
)
Пример 42. Результат
{
  "host": "192.0.2.25",
  "identity": "bob",
  "user": "frank",
  "timestamp": "2000-10-10T20:55:36Z",
  "message": "GET /apache_pb.gif HTTP/1.0",
  "method": "GET",
  "path": "/apache_pb.gif",
  "protocol": "HTTP/1.0",
  "status": 200,
  "size": 2326
}

rv_extract_from_dit

Извлекает домен и имя пользователя из записи DIT (Data Information Tree), используемой в протоколе LDAP.

Спецификация функции

rv_extract_from_dit(value: <строка>)
:: <строка>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строковое представление записи DIT

да

Примечания

Особенность функции, о которой нужно знать:

  • Результат возвращается в виде JSON-объекта с полями "username" и "domain".

  • Имя пользователя и домен возвращаются в нижнем регистре.

Ошибки

Функция rv_extract_from_dit может возвращать ошибки, для которых требуется обработка:

  • value закодировано не в UTF-8.

  • value не является корректной записью DIT.

Пример

Пример 43. Исходный код
rv_extract_from_dit!("CN=Dev-India,OU=Distribution Groups,DC=gp,DC=gl,DC=example,DC=com")
Пример 44. Результат
{
  "domain": "gp.gl.example.com",
  "username": "dev-india"
}

parse_etld

Разбирает eTLD (effective top-level domain) из строки value, представляющей собой доменное имя.

Спецификация функции

parse_etld(value: <строка>, [plus_parts: <целое число>, psl: <строка>])
:: <объект>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка домена.

да

plus_parts

целое число

Число поддоменов, возвращаемых функцией.

нет

psl

строка

Путь к файлу или URL списка публичных суффиксов.

По умолчанию используется список publicsuffix.org/list/public_suffix_list.dat.

нет

parse_etld возвращает структуру вида:

{
  "etld": "ac.uk",
  "etld_plus": "example.ac.uk",
  "known_suffix": true
}
  • etld — имя домена;

  • etld_plus — имя домена с поддоменами. Количество поддоменов определяется аргументом plus_parts;

  • known_suffix — true, если суффикс входит в список, переданный в аргументе psl, false — иначе.

Ошибки

Функция parse_etld может возвращать ошибки, для которых требуется обработка:

  • невозможно определить eTLD для строки value.

Примеры

Разбор eTLD

Пример 45. Исходный код
parse_etld!("sub.example.com")
Пример 46. Результат
{
  "etld": "com",
  "etld_plus": "com",
  "known_suffix": true
}

Разбор eTLD+1

Пример 47. Исходный код
parse_etld!("example.com", plus_parts: 1)
Пример 48. Результат
{
  "etld": "com",
  "etld_plus": "example.com",
  "known_suffix": true
}

Разбор eTLD с неизвестным суффиксом

Пример 49. Исходный код
parse_etld!("example.acmecorp")
Пример 50. Результат
{
  "etld": "acmecorp",
  "etld_plus": "acmecorp",
  "known_suffix": false
}

Разбор eTLD с другим PSL

Пример 51. Исходный код
parse_etld!("example.acmecorp",
# пример пути к списку доменов
psl: "resources/public_suffix_list.dat")
Пример 52. Результат
{
  "etld": "acmecorp",
  "etld_plus": "acmecorp",
  "known_suffix": false
}

dns_lookup

Выполняет DNS Lookup для доменного имени value.

Не рекомендуется применять dns_lookup в высоконагруженных сценариях. Функция выполняет сетевые запросы, используя однопоточный процесс, который блокирует поток выполнения при каждом запросе, пока не получит ответ, из-за чего производительность в высоконагруженных приложениях может деградировать.

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

Спецификация функции

dns_lookup(value: <строка>, [qtype: <строка>, qclass: <строка>, options: <объект>])
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Доменное имя.

да

qtype

строка

Тип искомой записи DNS.

нет

qclass

строка

Класс сети, для которой выполняется поиск DNS-записей.

IN

нет

options

строка

Опции поиска.

нет

Ошибки

Функция dns_lookup может возвращать ошибки, для которых требуется обработка:

  • Невозможно разобрать имя хоста value.

  • Невозможно разобрать тип запроса qtype.

  • Невозможно разобрать класс сети qclass.

  • Не удалось выполнить запрос DNS Lookup.

Примеры

Базовый поиск

Пример 53. Исходный код
res = dns_lookup!("dns.google")
# сбросить нестатический ttl, так что результат статический
res.answers = map_values(res.answers) -> |value| {
value.ttl = 600
value
}
# удалить дополнительные ответы
res.answers = filter(res.answers) -> |_, value| {
value.rData == "8.8.8.8"
}
# удалить класс, поскольку он динамический
res.additional = map_values(res.additional) -> |value| {
del(value.class)
value
}
res
Пример 54. Результат
{
  "additional": [
    {
      "domainName": "",
      "rData": "OPT ...",
      "recordType": "OPT",
      "recordTypeId": 41,
      "ttl": 0
    }
  ],
  "answers": [
    {
      "class": "IN",
      "domainName": "dns.google",
      "rData": "8.8.8.8",
      "recordType": "A",
      "recordTypeId": 1,
      "ttl": 600
    }
  ],
  "authority": [],
  "fullRcode": 0,
  "header": {
    "aa": false,
    "ad": false,
    "anCount": 2,
    "arCount": 1,
    "cd": false,
    "nsCount": 0,
    "opcode": 0,
    "qdCount": 1,
    "qr": true,
    "ra": true,
    "rcode": 0,
    "rd": true,
    "tc": false
  },
  "question": [
    {
      "class": "IN",
      "domainName": "dns.google",
      "questionType": "A",
      "questionTypeId": 1
    }
  ],
  "rcodeName": "NOERROR"
}

Заданные qclass и qtype

Пример 55. Исходный код
res = dns_lookup!("dns.google", class: "IN", qtype: "A")
# сбросить нестатический ttl, так что результат статический
res.answers = map_values(res.answers) -> |value| {
  value.ttl = 600
  value
}
#удалить дополнительные ответы
res.answers = filter(res.answers) -> |_, value| {
    value.rData == "8.8.8.8"
}
# удалить класс, поскольку он динамический
res.additional = map_values(res.additional) -> |value| {
    del(value.class)
    value
}
res
Пример 56. Результат
{
  "additional": [
    {
      "domainName": "",
      "rData": "OPT ...",
      "recordType": "OPT",
      "recordTypeId": 41,
      "ttl": 0
    }
  ],
  "answers": [
    {
      "class": "IN",
      "domainName": "dns.google",
      "rData": "8.8.8.8",
      "recordType": "A",
      "recordTypeId": 1,
      "ttl": 600
    }
  ],
  "authority": [],
  "fullRcode": 0,
  "header": {
    "aa": false,
    "ad": false,
    "anCount": 2,
    "arCount": 1,
    "cd": false,
    "nsCount": 0,
    "opcode": 0,
    "qdCount": 1,
    "qr": true,
    "ra": true,
    "rcode": 0,
    "rd": true,
    "tc": false
  },
  "question": [
    {
      "class": "IN",
      "domainName": "dns.google",
      "questionType": "A",
      "questionTypeId": 1
    }
  ],
  "rcodeName": "NOERROR"
}

Заданные опции

Пример 57. Исходный код
res = dns_lookup!("dns.google", options: {"timeout": 30, "attempts": 5})
# сбросить нестатический ttl, так что результат статический
res.answers = map_values(res.answers) -> |value| {
value.ttl = 600
value
}
# удалить дополнительные ответы
res.answers = filter(res.answers) -> |_, value| {
value.rData == "8.8.8.8"
}
# удалить класс, поскольку он динамический
res.additional = map_values(res.additional) -> |value| {
del(value.class)
value
}
res
Пример 58. Результат
{
  "additional": [
    {
      "domainName": "",
      "rData": "OPT ...",
      "recordType": "OPT",
      "recordTypeId": 41,
      "ttl": 0
    }
  ],
  "answers": [
    {
      "class": "IN",
      "domainName": "dns.google",
      "rData": "8.8.8.8",
      "recordType": "A",
      "recordTypeId": 1,
      "ttl": 600
    }
  ],
  "authority": [],
  "fullRcode": 0,
  "header": {
    "aa": false,
    "ad": false,
    "anCount": 2,
    "arCount": 1,
    "cd": false,
    "nsCount": 0,
    "opcode": 0,
    "qdCount": 1,
    "qr": true,
    "ra": true,
    "rcode": 0,
    "rd": true,
    "tc": false
  },
  "question": [
    {
      "class": "IN",
      "domainName": "dns.google",
      "questionType": "A",
      "questionTypeId": 1
    }
  ],
  "rcodeName": "NOERROR"
}

Заданный DNS-сервер

Пример 59. Исходный код
res = dns_lookup!("dns.google", options: {"servers": ["dns.quad9.net"]})
# сбросить нестатический ttl, так что результат статический
res.answers = map_values(res.answers) -> |value| {
value.ttl = 600
value
}
# удалить дополнительные ответы
res.answers = filter(res.answers) -> |_, value| {
value.rData == "8.8.8.8"
}
# удалить класс, поскольку он динамический
res.additional = map_values(res.additional) -> |value| {
del(value.class)
value
}
res
Пример 60. Результат
{
  "additional": [
  {
    "domainName": "",
    "rData": "OPT ...",
    "recordType": "OPT",
    "recordTypeId": 41,
    "ttl": 0
  }
  ],
  "answers": [
    {
      "class": "IN",
      "domainName": "dns.google",
      "rData": "8.8.8.8",
      "recordType": "A",
      "recordTypeId": 1,
      "ttl": 600
    }
  ],
  "authority": [],
  "fullRcode": 0,
  "header": {
  "aa": false,
  "ad": false,
  "anCount": 2,
  "arCount": 1,
  "cd": false,
  "nsCount": 0,
  "opcode": 0,
  "qdCount": 1,
  "qr": true,
  "ra": true,
  "rcode": 0,
  "rd": true,
  "tc": false
  },
  "question": [
    {
      "class": "IN",
      "domainName": "dns.google",
      "questionType": "A",
      "questionTypeId": 1
    }
  ],
  "rcodeName": "NOERROR"
}

parse_glog

Разбирает value с использованием формата glog (Google Logging Library).

Спецификация функции

parse_glog(value: <строка>)
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для разбора.

да

Ошибки

Функция parse_glog может возвращать ошибки, для которых требуется обработка:

  • value не соответствует формату glog.

Примеры

Разбор через формат glog

Пример 61. Исходный код
parse_glog!("I20210131 14:48:54.411655 15520 main.c++:9] Hello world!")
Пример 62. Результат
{
  "file": "main.c++",
  "id": 15520,
  "level": "info",
  "line": 9,
  "message": "Hello world!",
  "timestamp": "2021-01-31T14:48:54.411655Z"
}

parse_grok

Разбирает value, используя формат grok. Поддерживаются все шаблоны grok.

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

Спецификация функции

parse_grok(value: <строка>, pattern: <строка>)
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для разбора.

да

pattern

строка

Шаблон Grok.

да

Ошибки

Функция parse_grok может возвращать ошибки, для которых требуется обработка:

  • value не удается разобрать с использованием предоставленного шаблона pattern.

Примеры

Разбор с использованием Grok

Пример 63. Исходный код
parse_grok!(
"2020-10-02T23:22:12.223222Z info Hello world",
"%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}"
)
Пример 64. Результат
{
  "level": "info",
  "message": "Hello world",
  "timestamp": "2020-10-02T23:22:12.223222Z"
}

parse_groks

Разбирает value, используя несколько шаблонов grok. Поддерживаются все шаблоны grok.

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

Спецификация функции

parse_groks(value: <строка>, patterns: <массив>, [aliases: <объект>])
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для разбора.

да

patterns

массив

Шаблоны Grok, которые применяются последовательно до первого совпадения.

да

aliases

объект

Общий набор псевдонимов Grok, на которые можно ссылаться в шаблонах для их упрощения.

true

нет

Ошибки

Функция parse_groks может возвращать ошибки, для которых требуется обработка:

  • value не удается разобрать с использованием предоставленных шаблонов.

Примеры

Разбор с использованием нескольких шаблонов Grok

Пример 65. Исходный код
parse_groks!(
"2020-10-02T23:22:12.223222Z info Hello world",
patterns: [
"%{common_prefix} %{_status} %{_message}",
"%{common_prefix} %{_message}",
],
aliases: {
"common_prefix": "%{_timestamp} %{_loglevel}",
"_timestamp": "%{TIMESTAMP_ISO8601:timestamp}",
"_loglevel": "%{LOGLEVEL:level}",
"_status": "%{POSINT:status}",
"_message": "%{GREEDYDATA:message}"
})
Пример 66. Результат
{
  "level": "info",
  "message": "Hello world",
  "timestamp": "2020-10-02T23:22:12.223222Z"
}

parse_influxdb

Разбирает value как строку протокола строк InfluxDB, создавая список метрик, совместимых с Vector.

Спецификация функции

parse_influxdb(value: <строка> )
:: <массив> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строковое представление протокола строк InfluxDB для разбора.

да

Примечания

У этой функции есть особенности поведения.

  • Эта функция вернет событие журнала с размерностью Vector-совместимой метрики, но не само событие метрики. Вероятно, вам потребуется обработать вывод этой функции преобразованием log_to_metric с опцией all_metrics, установленной в значение true, чтобы конвертировать события логов с размерностью метрик в события метрик и создать реальные метрики.

  • Единственный тип метрики, который создается — gauge. К имени каждой метрики добавляется префикс, состоящий из поля measurement, подчеркивания (_) и поля field key.

  • строка — это единственный тип, который не поддерживается как значение поля, из-за ограничений модели метрик Vector.

Ошибки

Функция parse_influxdb может возвращать ошибки, для которых требуется обработка:

  • value — не валидная строка протокола строк InfluxDB.

  • Список полей содержит поле типа строка.

  • Список полей содержит значение поля NaN.

Примеры

Разбор протокола строк InfluxDB

Пример 67. Исходный код
parse_influxdb!("cpu,host=A,region=us-west usage_system=64i,usage_user=10u,temperature=50.5,on=true,sleep=false 1590488773254420000")
Пример 68. Результат
[
  {
    "gauge": {
      "value": 64
    },
    "kind": "absolute",
    "name": "cpu_usage_system",
    "tags": {
      "host": "A",
      "region": "us-west"
    },
    "timestamp": "2020-05-26T10:26:13.254420Z"
  },
  {
    "gauge": {
      "value": 10
    },
    "kind": "absolute",
    "name": "cpu_usage_user",
    "tags": {
      "host": "A",
      "region": "us-west"
    },
    "timestamp": "2020-05-26T10:26:13.254420Z"
  },
  {
    "gauge": {
      "value": 50.5
    },
    "kind": "absolute",
    "name": "cpu_temperature",
    "tags": {
      "host": "A",
      "region": "us-west"
    },
    "timestamp": "2020-05-26T10:26:13.254420Z"
  },
  {
    "gauge": {
      "value": 1
    },
    "kind": "absolute",
    "name": "cpu_on",
    "tags": {
      "host": "A",
      "region": "us-west"
    },
    "timestamp": "2020-05-26T10:26:13.254420Z"
  },
  {
    "gauge": {
      "value": 0
    },
    "kind": "absolute",
    "name": "cpu_sleep",
    "tags": {
      "host": "A",
      "region": "us-west"
    },
    "timestamp": "2020-05-26T10:26:13.254420Z"
  }
]

parse_klog

Разбирает value в формате klog, используемом компонентами Kubernetes.

Спецификация функции

parse_klog(value: <строка>)
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для разбора.

да

Ошибки

Функция parse_klog может возвращать ошибки, для которых требуется обработка:

  • value не соответствует формату klog.

Примеры

Разбор по формату klog

Пример 69. Исходный код
parse_klog!("I0505 17:59:40.692994 28133 klog.go:70] hello from klog")
Пример 70. Результат
{
  "file": "klog.go",
  "id": 28133,
  "level": "info",
  "line": 70,
  "message": "hello from klog",
  "timestamp": "2024-05-05T17:59:40.692994Z"
}

rv_parse_leef

Разбирает value в формате Log Event Extended Format (LEEF).

Спецификация функции

rv_parse_leef(value: <строка>)
:: <объект>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строковое представление сообщения LEEF

да

Ошибки

Функция rv_parse_leef может возвращать ошибки, для которых требуется обработка:

  • value не является корректным сообщением LEEF.

Пример

Сообщение LEEF с заголовком syslog и атрибутами события, разделенными символом ^

Пример 71. Исходный код
rv_parse_leef!("<13>1 2024-07-18T11:07:53.520Z 192.168.1.1 LEEF:2.0|Microsoft|MSExchange|2007|7732|^|dvchost=www.example.com^msg=io\t|p")
Пример 72. Результат
{
  "syslog_facility": "1",
  "syslog_priority": "13",
  "syslog_severity": "5",
  "at": "2024-07-18T11:07:53.520Z",
  "ahost": "192.168.1.1",
  "dvchost": "www.example.com",
  "msg": "io\t|p",
  "deviceVendor": "Microsoft",
  "eventName": "7732",
  "productName": "MSExchange",
  "productVersion": "2007",
}

parse_linux_authorization

Разбирает журналы авторизации Linux, которые обычно находятся в каталогах /var/log/auth.log (в системах на основе Debian) или /var/log/secure (в системах на основе RedHat), в соответствии с форматом syslog.

Спецификация функции

parse_linux_authorization(value: <строка>)
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Текст, содержащий сообщение для разбора.

да

Примечания

Эта функция имеет особое поведение: если в сообщении не указан год, он определяется автоматически:

  • Если текущий месяц — январь, а сообщение относится к декабрю, то используется предыдущий год.

  • В противном случае используется текущий год.

Ошибки

Функция parse_linux_authorization может возвращать ошибки, для которых требуется обработка:

  • value не является правильно отформатированным сообщением syslog.

Примеры

Разбор события авторизации Linux

Пример 73. Исходный код
parse_linux_authorization!(
s'Mar 23 01:49:58 localhost sshd[1111]: Accepted publickey for eng from 	198.51.100.1 port 8888 ssh2: RSA SHA256:foobar'
)
Пример 74. Результат
{
  "appname": "sshd",
  "hostname": "localhost",
  "message": "Accepted publickey for eng from 198.51.100.1 port 8888 ssh2: RSA SHA256:foobar",
  "procid": 1111,
  "timestamp": "2023-03-23T01:49:58Z"
}

parse_logfmt

Разбирает value в формате logfmt.

  • Ключи и значения могут быть заключены в двойные кавычки ".

  • Символ " может быть экранирован символом \.

  • Согласно спецификации logfmt, ключами без значений присваивается логическое значение true.

  • Функция обрабатывает три управляющие последовательности при разборе: \n, \" и \\. Это значит, что, например, \n во входной строке будет заменен на действительный символ новой строки в разобранных ключах или значениях.

Спецификация функции

parse_logfmt(value: <строка>)
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для разбора.

да

Ошибки

Функция parse_logfmt может возвращать ошибки, для которых требуется обработка:

  • value не является правильно отформатированной строкой "ключ — значение" (logfmt).

Примеры

Разбор лога в формате logfmt

Пример 75. Исходный код
parse_logfmt!(
"@timestamp=\"Sun Jan 10 16:47:39 EST 2021\" level=info msg=\"Stopping all fetchers\" tag#production=stopping_fetchers id=ConsumerFetcherManager-1382721708341 module=kafka.consumer.ConsumerFetcherManager"
)
Пример 76. Результат
{
  "@timestamp": "Sun Jan 10 16:47:39 EST 2021",
  "id": "ConsumerFetcherManager-1382721708341",
  "level": "info",
  "module": "kafka.consumer.ConsumerFetcherManager",
  "msg": "Stopping all fetchers",
  "tag#production": "stopping_fetchers"
}

rv_parse_msgpack

Разбирает value в формате MessagePack.

Спецификация функции

rv_parse_msgpack(value: <строка>)
:: <объект>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строковое представление MessagePack

да

Примечания

Особенности функции, о которых нужно знать:

  • Возвращаются только типы MessagePack. Дополнительные типы (extension) не поддерживаются. Если нужно преобразовать строку в метку времени, используйте функцию parse_timestamp.

  • В типе map поддерживаются только строковые ключи.

Ошибки

Функция rv_parse_msgpack может возвращать ошибки, для которых требуется обработка:

  • value не является массивом байтов.

Примеры

Преобразование массива байтов

Пример 77. Исходный код
# .message -- массив байтов [135, 163, 105, 110, 116, 1, 165, 102, 108, 111, 97, 116, 203, 63, 224, 0, 0, 0, 0, 0, 0, 167, 98, 111, 111, 108, 101, 97, 110, 195, 164, 110, 117, 108, 108, 192, 166, 115, 116, 114, 105, 110, 103, 167, 102, 111, 111, 32, 98, 97, 114, 165, 97, 114, 114, 97, 121, 146, 163, 102, 111, 111, 163, 98, 97, 114, 166, 111, 98, 106, 101, 99, 116, 130, 163, 102, 111, 111, 1, 163, 98, 97, 122, 203, 63, 224, 0, 0, 0, 0, 0, 0,]
rv_parse_msgpack!(.message)
Пример 78. Результат
{
  "int": 1,
  "float": 0.5,
  "boolean": true,
  "null": null,
  "string": "foo bar",
  "array": [
    "foo",
    "bar"
  ],
  "object": {
    "foo": 1,
    "baz": 0.5
}

Преобразование после декодирования из Base64

Пример 79. Исходный код
rv_parse_msgpack!(decode_base64!("3wAAAAGlZmllbGSldmFsdWU="))
Пример 80. Результат
{
  "field": "value"
}

rv_parse_msgpack_batch

Разбирает value, которое состоит из нескольких сообщений в формате MessagePack.

Спецификация функции

rv_parse_msgpack_batch(value: <строка>)
:: <массив объектов>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строковое представление пакета объектов MessagePack

да

Примечания

Особенности функции, о которых нужно знать:

  • Возвращаются только типы MessagePack. Дополнительные типы (extension) не поддерживаются. Если нужно преобразовать строку в метку времени, используйте функцию parse_timestamp.

  • В типе map поддерживаются только строковые ключи.

Ошибки

Функция rv_parse_msgpack_batch может возвращать ошибки, для которых требуется обработка:

  • value не является массивом байтов.

Примеры

Преобразование массива байтов

Пример 81. Исходный код
# .message -- массив байтов [135, 163, 105, 110, 116, 1, 165, 102, 108, 111, 97, 116, 203, 63, 224, 0, 0, 0, 0, 0, 0, 167, 98, 111, 111, 108, 101, 97, 110, 195, 164, 110, 117, 108, 108, 192, 166, 115, 116, 114, 105, 110, 103, 167, 102, 111, 111, 32, 98, 97, 114, 165, 97, 114, 114, 97, 121, 146, 163, 102, 111, 111, 163, 98, 97, 114, 166, 111, 98, 106, 101, 99, 116, 130, 163, 102, 111, 111, 1, 163, 98, 97, 122, 203, 63, 224, 0, 0, 0, 0, 0, 0, 135, 163, 105, 110, 116, 1, 165, 102, 108, 111, 97, 116, 203, 63, 224, 0, 0, 0, 0, 0, 0, 167, 98, 111, 111, 108, 101, 97, 110, 195, 164, 110, 117, 108, 108, 192, 166, 115, 116, 114, 105, 110, 103, 167, 102, 111, 111, 32, 98, 97, 114, 165, 97, 114, 114, 97, 121, 146, 163, 102, 111, 111, 163, 98, 97, 114, 166, 111, 98, 106, 101, 99, 116, 130, 163, 102, 111, 111, 1, 163, 98, 97, 122, 203, 63, 224, 0, 0, 0, 0, 0, 0,]
rv_parse_msgpack_batch!(.message)
Пример 82. Результат
[
  {
    "int": 1,
    "float": 0.5,
    "boolean": true,
    "null": null,
    "string": "foo bar",
    "array": [
      "foo",
      "bar"
    ],
    "object": {
      "foo": 1,
      "baz": 0.5
    }
  },
  {
    "int": 1,
    "float": 0.5,
    "boolean": true,
    "null": null,
    "string": "foo bar",
    "array": [
      "foo",
      "bar"
    ],
    "object": {
      "foo": 1,
      "baz": 0.5
    }
  }
]

Преобразование после декодирования из Base64

Пример 83. Исходный код
rv_parse_msgpack_batch(decode_base64!("3wAAAAGlZmllbGSldmFsdWXfAAAAAaVmaWVsZKV2YWx1ZQ=="))
Пример 84. Результат
[
  {
    "field": "value"
  },
  {
    "field": "value"
  }
]

rv_parse_netflow

Разбирает value в формате пакетов NetFlow.

Спецификация функции

rv_parse_netflow(value: <строка>)
:: <массив объектов>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строковое представление пакетов NetFlow.

да

Ошибки

Функция rv_parse_netflow может возвращать ошибки, для которых требуется обработка:

  • value не является правильным NetFlow пакетом

Примеры

Разбор пакетов NetFlow

Пример 85. Исходный код
rv_parse_netflow!(decode_base64!("AAUCAAMABAAFAAYHCAkAAQIDBAUGBwgJAAECAwQFBgcICQABAgMEBQYHCAkAAQIDBAUGBwgJAAECAwQFBgcICQABAgMEBQYH"))
Пример 86. Результат
[
  {
    "V5": {
      "body": {
        "d_octets": 66051,
        "d_pkts": 101124105,
        "dst_addr": "4.5.6.7",
        "dst_as": 515,
        "dst_mask": 5,
        "dst_port": 1029,
        "first": {
          "nanos": 87000000,
          "secs": 67438
        },
        "input": 515,
        "last": {
          "nanos": 553000000,
          "secs": 134807
        },
        "next_hop": "8.9.0.1",
        "output": 1029,
        "pad1": 6,
        "pad2": 1543,
        "protocol_number": 8,
        "protocol_type": "EGP",
        "src_addr": "0.1.2.3",
        "src_as": 1,
        "src_mask": 4,
        "src_port": 515,
        "tcp_flags": 7,
        "tos": 9
      },
      "header": {
        "count": 512,
        "engine_id": 7,
        "engine_type": 6,
        "flow_sequence": 33752069,
        "sampling_interval": 2057,
        "sys_up_time": {
          "nanos": 672000000,
          "secs": 50332
        },
        "unix_nsecs": 134807553,
        "unix_secs": 83887623,
        "version": 5
      }
    }
  }
]

parse_nginx_log

Разбирает строки журналов доступа и ошибок Nginx. Строки могут быть в формате combined или error.

Спецификация функции

parse_nginx_log(value: <строка>, format: <строка>, [timestamp_format: <строка>])
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для разбора.

да

format

строка

Формат, используемый для разбора журнала.

да

timestamp_format

строка

Формат даты/времени, используемый для кодирования метки времени. Если в метке времени не указан часовой пояс, время разбирается как локальное. Формат по умолчанию %d/%b/%Y:%T %z для комбинированных журналов и %Y/%m/%d %H:%M:%S для журналов ошибок.

%d/%b/%Y:%T %z

нет

Примечания

Эта функция имеет особое поведение, о котором следует знать.

  • Отсутствующая информация в сообщении может быть обозначена -. Эти поля опускаются в результате.

Ошибки

Функция parse_nginx_log может возвращать ошибки, для которых требуется обработка:

  • value не соответствует указанному формату.

  • timestamp_format не является допустимой строкой формата.

  • Метка времени в value не удается разобрать с использованием предоставленного timestamp_format.

Примеры

Разбор в формате журнала Nginx (комбинированном)

Пример 87. Исходный код
parse_nginx_log!(
s'203.0.113.1 - alice [01/Apr/2021:12:02:31 +0000] "POST /not-found HTTP/1.1" 404 153 "http://localhost/somewhere" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36" "2.75"',
"combined",
)
Пример 88. Результат
{
  "client": "203.0.113.1",
  "user": "alice",
  "timestamp": "2021-04-01T12:02:31Z",
  "request": "POST /not-found HTTP/1.1",
  "method": "POST",
  "path": "/not-found",
  "protocol": "HTTP/1.1",
  "status": 404,
  "size": 153,
  "referer": "http://localhost/somewhere",
  "agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36",
  "compression": "2.75"
}

Разбор в формате журнала ошибок Nginx

Пример 89. Исходный код
parse_nginx_log!(
s'2021/04/01 13:02:31 [error] 31#31: *1 open() "/usr/share/nginx/html/not-found" failed (2: No such file or directory), client: 203.0.113.1, server: localhost, request: "POST /not-found HTTP/1.1", host: "localhost:8081"',
"error"
)
Пример 90. Результат
{
  "timestamp": "2021-04-01T13:02:31Z",
  "severity": "error",
  "pid": 31,
  "tid": 31,
  "cid": 1,
  "message": "open() \"/usr/share/nginx/html/not-found\" failed (2: No such file or directory)",
  "client": "203.0.113.1",
  "server": "localhost",
  "request": "POST /not-found HTTP/1.1",
  "host": "localhost:8081"
}

parse_proto

Разбирает value как payload — полезную нагрузку Protocol Buffers.

Спецификация функции

parse_proto(value: <строка>, desc_file: <строка>, message_type: <строка>)
:: <объект>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Полезная нагрузка Protocol Buffers для разбора.

да

desc_file

строка

Путь к файлу набора дескрипторов Protocol Buffers. Должен быть строковым литералом. Этот файл является результатом работы команды protoc -o.

да

message_type

строка

Имя типа сообщения, используемого для сериализации. Должно быть строковым литералом.

да

Примечание

Функция разбирает и возвращает только сообщения (message) Protocol Buffers.

Ошибки

Функция encode_proto может возвращать ошибки, для которых требуется обработка:

  • value не является валидным payload Protocol Buffers.

  • Файл, указанный в аргументе desc_file, не существует.

  • Тип сообщения, указанный в аргументе message_type, отсутствует в файле дескрипторов.

Пример

Пример 91. Исходный код
.payload = encode_base64(encode_proto!({"name": "someone", "phones": [{"number": "123456"}]}, "resources/protobuf_descriptor_set.desc", "test_protobuf.Person"))
Пример 92. Результат
Cgdzb21lb25lIggKBjEyMzQ1Ng==

rv_parse_qradar

Разбирает value в формате QRadar, включая необязательный заголовок syslog.

Спецификация функции

rv_parse_qradar(value: <строка>)
:: <объект>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строковое представление сообщения QRadar

да

Ошибки

Функция rv_parse_qradar может возвращать ошибки, для которых требуется обработка:

  • value закодировано не в UTF-8;

  • value содержит ключ без соответствующего значения.

Примеры

Разбор сообщения без заголовка syslog и со вложенным полем Message

Пример 93. Исходный код
rv_parse_msgpack!("AgentDevice=WindowsLog\tAgentLogFile=Security\tPluginVersion=7.2.9.105\tSource=Microsoft-Windows-Security-Auditing\tComputer=dc04.lab2012.local\tOriginatingComputer=192.0.2.0\tUser=\tDomain=\tEventID=4624\tEventIDCode=4624\tEventType=8\tEventCategory=12544\tRecordNumber=11103971\tTimeGenerated=1610705793\tTimeWritten=1610705793\tLevel=Log Always\tKeywords=Audit Success\tTask=SE_ADT_LOGON_LOGON\tOpcode=Info\tMessage=Вход с учетной записью выполнен успешно.  Субъект:  ИД безопасности:  NULL SID  Имя учетной записи:  -  Домен учетной записи:  -  Код входа:  0x0  Тип входа:   3  Уровень олицетворения:  Делегирование  Новый вход:  ИД безопасности:  NT AUTHORITY\\СИСТЕМА  Имя учетной записи:  USER  Домен учетной записи:  LAB2012  Код входа:  0x1E6112B9  GUID входа:  {06457096-03A4-55FB-28EA-9882B565E681}  Сведения о процессе:  Идентификатор процесса:  0x0  Имя процесса:  -  Сведения о сети:  Имя рабочей станции: -  Сетевой адрес источника: fe80::7830:1b00:4e5f:1300  Порт источника:  51755  Данное событие возникает при создании сеанса входа.\n".as_bytes())
Пример 94. Результат
{
  "AgentDevice": "WindowsLog",
  "AgentLogFile": "Security",
  "PluginVersion": "7.2.9.105",
  "Source": "Microsoft-Windows-Security-Auditing",
  "Computer": "dc04.lab2012.local",
  "OriginatingComputer": "192.0.2.0"
  "User": ""
  "Domain": ""
  "EventID": "4624"
  "EventIDCode": "4624"
  "EventType": "8"
  "EventCategory": "12544"
  "RecordNumber": "11103971"
  "TimeGenerated": "1610705793"
  "TimeWritten": "1610705793"
  "Level": "Log Always"
  "Keywords": "Audit Success"
  "Task": "SE_ADT_LOGON_LOGON"
  "Opcode": "Info"
  "Message": {
    "Вход с учетной записью выполнен успешно.": "",
    "Субъект": "ИД безопасности: NULL SID",
    "Имя учетной записи": "-",
    "Домен учетной записи": "-",
    "Код входа": "0x0",
    "Тип входа": "3",
    "Уровень олицетворения": "Делегирование",
    "Новый вход": {
      "ИД безопасности": "NT AUTHORITY\\СИСТЕМА",
      "Имя учетной записи": "USER",
      "Домен учетной записи": "LAB2012",
      "Код входа": "0x1E6112B9",
      "GUID входа": "{06457096-03A4-55FB-28EA-9882B565E681}"
    },
    "Сведения о процессе": {
      "Идентификатор процесса": "0x0",
      "Имя процесса": "-"
    },
    "Сведения о сети": {
      "Имя рабочей станции": "-",
      "Сетевой адрес источника": "2001:DB8::7830:1b00:4e5f:1300",
      "Порт источника": "51755"
    }
  }
}

Разбор сообщения c заголовком syslog

Пример 95. Исходный код
rv_parse_msgpack!("<13>Jan 15 13:16:35 DC04  AgentDevice=WindowsLog\tAgentLogFile=Security\tPluginVersion=7.2.9.105\tSource=Microsoft-Windows-Security-Auditing\tComputer=dc04.lab2012.local\tOriginatingComputer=192.0.2.0\tUser=\tDomain=\tEventID=4624\tEventIDCode=4624\tEventType=8\tEventCategory=12544\tRecordNumber=11103971\tTimeGenerated=1610705793\tTimeWritten=1610705793\tLevel=Log Always\tKeywords=Audit Success\tTask=SE_ADT_LOGON_LOGON\tOpcode=Info\n".as_bytes())
Пример 96. Результат
{
  "syslog_facility": "1",
  "syslog_priority": "13",
  "syslog_severity": "5",
  "at": "Jan 15 13:16:35",
  "ahost": "DC04",
  "AgentDevice": "WindowsLog",
  "AgentLogFile": "Security",
  "PluginVersion": "7.2.9.105",
  "Source": "Microsoft-Windows-Security-Auditing",
  "Computer": "dc04.lab2012.local",
  "OriginatingComputer": "192.0.2.0"
  "User": ""
  "Domain": ""
  "EventID": "4624"
  "EventIDCode": "4624"
  "EventType": "8"
  "EventCategory": "12544"
  "RecordNumber": "11103971"
  "TimeGenerated": "1610705793"
  "TimeWritten": "1610705793"
  "Level": "Log Always"
  "Keywords": "Audit Success"
  "Task": "SE_ADT_LOGON_LOGON"
  "Opcode": "Info"
}

parse_syslog

Разбирает value в формате syslog.

Спецификация функции

parse_syslog(value: <строка>)
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Текст, содержащий сообщение syslog для разбора.

да

Примечания

Эта функция имеет особое поведение, о котором следует знать.

  • Функция разбирает различные форматы syslog, такие как RFC 6587, RFC 5424, RFC 3164, стиль syslog в Nginx и другие распространенные варианты.

  • Все значения возвращаются как строки. Рекомендуется преобразовывать значения в нужные типы, используя соответствующие функции.

Ошибки

Функция parse_syslog может возвращать ошибки, для которых требуется обработка:

  • value не является правильно отформатированным сообщением syslog.

Примеры

Разбор журнала Syslog (5424)

Пример 97. Исходный код
parse_syslog!(
s'<13>1 2020-03-13T20:45:38.119Z example.name non 2426 ID931 [exampleSDID@32473 iut="3" eventSource= "Application" eventID="1011"] Try to override the THX port, maybe it will reboot the neural interface!'
)
Пример 98. Результат
{
  "severity": "notice",
  "facility": "user",
  "timestamp": "2020-03-13T20:45:38.119Z",
  "hostname": "example.name",
  "appname": "non",
  "procid": 2426,
  "msgid": "ID931",
  "message": "Try to override the THX port, maybe it will reboot the neural interface!",
  "exampleSDID@32473": {
    "eventID": "1011",
    "eventSource": "Application",
    "iut": "3"
  },
  "version": 1
}

Функции преобразования кодов и параметров Syslog

to_syslog_facility

Преобразует value из кода устройства Syslog в соответствующее ему ключевое слово Syslog, например, 0 в "kern", а 1 — в "user".

Спецификация функции

to_syslog_facility(value: <целое число>)
:: <строка> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

целое число

Код устройства.

да

Ошибки

Функция to_syslog_facility может возвращать ошибки, для которых требуется обработка:

  • value не является допустимым кодом устройства Syslog.

Примеры

Приведение к устройству Syslog

Пример 99. Исходный код
to_syslog_facility!(4)
Пример 100. Результат
auth

to_syslog_level

Преобразует value из кода уровня серьезности Syslog в соответствующее ключевое слово, например, 0 в "emerg", 1 — в "alert".

Спецификация функции

to_syslog_level(value: <целое число>)
:: <строка> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

целое число

Код уровня серьезности.

да

Ошибки

Функция to_syslog_level может возвращать ошибки, для которых требуется обработка:

  • value не является допустимым кодом уровня серьезности Syslog.

Примеры

Приведение к уровню Syslog

Пример 101. Исходный код
to_syslog_level!(5)
Пример 102. Результат
notice

to_syslog_severity

Преобразует value, ключевое слово уровня Syslog, в целое число уровня серьезности Syslog (0 до 7).

Спецификация функции

to_syslog_severity(value: <строка>)
:: <целое число> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Ключевое слово уровня Syslog для преобразования.

да

Ошибки

Функция to_syslog_severity может возвращать ошибки, для которых требуется обработка:

  • value не является допустимым ключевым словом уровня Syslog.

Примеры

Приведение к уровню серьезности Syslog

Пример 103. Исходный код
to_syslog_severity!("alert")
Пример 104. Результат
1

Функции разбора структурированных данных

parse_csv

Разбирает отдельную строку в формате CSV. Если входное значение состоит из нескольких строк, будет проанализирована только первая строка.

Спецификация функции

parse_csv(value: <строка>, [delimiter: <строка>])
:: <массив> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для разбора.

да

delimiter

строка

Разделитель полей для использования при разборе. Должен быть однобайтовым символом UTF-8.

,

нет

Примечания

У этой функции есть специальное поведение, которое следует учитывать:

  • Все значения возвращаются как строки. Рекомендуется преобразовывать значения в нужные типы, используя соответствующие функции.

Ошибки

Функция parse_csv может возвращать ошибки, для которых требуется обработка:

  • Разделитель не является однобайтовым символом UTF-8.

  • value не является допустимой строкой CSV.

Примеры

Разбор отдельной строки в формате CSV

Пример 105. Исходный код
parse_csv!("foo,bar,\"foo \"\", bar\"")
Пример 106. Результат
[
  "foo",
  "bar",
  "foo \", bar"
]

Разбор отдельной строки в формате CSV с пользовательским разделителем

Пример 107. Исходный код
parse_csv!("foo bar", delimiter: " ")
Пример 108. Результат
[
  "foo",
  "bar"
]

rv_parse_html

Разбирает value в формате HTML.

Спецификация функции

rv_parse_html(value: <строка>, [trim: <логическое значение>, attr_prefix: <строка>, text_key: <строка>, always_use_text_key: <логическое значение>, parse_bool: <логическое значение>, parse_null: <логическое значение>, parse_number: <логическое значение>])
:: <объект>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

HTML-документ в виде строки.

да

trim

логическое значение

Удалять пробелы вокруг элементов HTML.

true

нет

include_attr

логическое значение

Включать атрибуты HTML в возвращаемый объект.

true

нет

attr_prefix

строка

Префикс строки для ключей атрибутов HTML.

"@"

нет

text_key

строка

Ключ, под которым возвращается содержимое элементов HTML.

"text"

нет

always_use_text_key

логическое значение

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

false

нет

parse_bool

логическое значение

Интерпретировать строки "true" и "false" как логические значения.

true

нет

parse_null

логическое значение

Интерпретировать пустые строки и строки "null" как пустые значения.

true

нет

parse_number

логическое значение

Интерпретировать строковые представления чисел ("1") как числовые типы.

true

нет

Ошибки

Функция rv_parse_html может возвращать ошибки, для которых требуется обработка:

  • value не является корректным документом HTML.

Примеры

С указанием text_key, без разбора числовых типов

Пример 109. Исходный код
value = s'<book category="PROGRAMMING"> <title lang="en">The Rust programming language</title> <author>Steve Klabnik, Carol Nichols</author> <year>2019</year></book>'
rv_parse_html!(value,
text_key: "value",
parse_number: false)
Пример 110. Результат
{
  "book": {
    "@category": "PROGRAMMING",
    "author": "Steve Klabnik, Carol Nichols",
    "title": {
      "@lang": "en",
      "value": "The Rust programming language"
    },
    "year": "2019"
  }
}

С использованием text_key во всех случаях

Пример 111. Исходный код
value = s'<b>test</b>'
rv_parse_html!(value,
text_key: "value",
text_key: "node",
always_use_text_key: true)
Пример 112. Результат
{
  "b": {
    "node": "test"
  }
}

Без удаления пробелов между элементами

Пример 113. Исходный код
value = s'<root>  <a>test</a>  </root>'
rv_parse_html!(value, trim: false)
Пример 114. Результат
{
  "root": {
    "a": "test",
    "text": [
      "  ",
      "  "
    ]
  }
}

parse_json

Разбирает value как JSON.

Чтобы извлечь содержимое из поврежденного JSON, используйте функцию rv_json_extract_payload.

Спецификация функции

parse_json(value: <строка>, [max_depth: <целое число>, lossy: <логическое значение>])
:: <логическое значение | целое число | число с плавающей точкой | строка | объект | массив | пустое значение> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка с представлением JSON для разбора.

да

max_depth

целое число

Количество уровней для разбора вложенных JSON-документов. Значение должно быть в диапазоне от 1 до 128.

нет

lossy

логическое значение

Разбирать ли JSON способом с потерями. Если аргумент установлен в true, невалидные UTF-8 символы заменяются на символ Юникода � (U+FFFD), иначе возвращается ошибка, если есть любые невалидные UTF-8 символы.

true

нет

Примечания

У этой функции есть специальное поведение, которое следует учитывать:

  • Возвращаются только типы JSON. Если нужно преобразовать string в timestamp, используйте функцию parse_timestamp.

Ошибки

Функция parse_json может возвращать ошибки, для которых требуется обработка:

  • value не является допустимым JSON-представлением.

Примеры

Разбор JSON

Пример 115. Исходный код
parse_json!("{\"key\": \"val\"}")
Пример 116. Результат
{
  "key": "val"
}

Разбор JSON с ограничением глубины

Пример 117. Исходный код
parse_json!("{\"top_level\":{\"key\": \"val\"}}",
max_depth: 1)
Пример 118. Результат
{
  "top_level": "{\"key\": \"val\"}"
}

rv_json_extract_payload

Извлекает значение ключа payload_key из поврежденного или невалидного JSON.

Спецификация функции

rv_json_extract_payload(value: <строка>, payload_key: <строка>)
:: <логическое значение | целое число | число с плавающей точкой | строка | объект | массив | пустое значение>, <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка с представлением JSON для извлечения

да

payload_key

строка

Ключ, значение которого нужно извлечь

да

Примечания

Особенность функции, о которой нужно знать:

  • Если указанный ключ встречается несколько раз, то будет извлечено значение только первого вхождения.

Ошибки

Функция rv_json_extract_payload может возвращать ошибки, для которых требуется обработка:

  • value не содержит ключ payload_key.

Примеры

JSON с валидной структурой:

Пример 119. Исходный код
rv_json_extract_payload(s'{"a": 123, "payload"    : "data"}',
payload_key: "payload")
Пример 120. Результат
"data"

JSON с невалидной структурой:

Пример 121. Исходный код
rv_json_extract_payload(s'"asd":123,"payload" : "text"',
payload_key: "payload")
Пример 122. Результат
"text"

Несколько ключей payload_key:

Пример 123. Исходный код
rv_json_extract_payload(s'{ asd":123,"payload" : "first", "payload": "second" }', payload_key: "payload")
Пример 124. Результат
"first"

parse_key_value

Разбирает value в формате "ключ — значение", также известном как logfmt.

  • Ключи и значения могут быть заключены в кавычки ".

  • Символы " могут быть экранированы с помощью обратной косой черты \.

Спецификация функции

parse_key_value(value: <строка>, [key_value_delimiter: <строка>, field_delimiter: <строка>, whitespace: <строка>, accept_standalone_key: <логическое значение>])
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для разбора.

да

key_value_delimiter

строка

Строка, разделяющая ключ и значение.

=

нет

field_delimiter

строка

Строка, разделяющая каждую пару "ключ — значение".

(пробел)

нет

whitespace

строка

Обработка пробелов вокруг разделителя, заданного в параметре key_value_delimiter:

  • lenient — игнорировать пробелы;

  • strict — интерпретировать пробелы как обычные символы.

lenient

нет

accept_standalone_key

логическое значение

Разрешены ли ключи без значений. Если такие ключи разрешены, в возвращаемом объекте им будет присвоено значение true.

true

нет

Примечания

У этой функции есть специальное поведение, которое следует учитывать:

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

Ошибки

Функция parse_key_value может возвращать ошибки, для которых требуется обработка:

  • value не является правильно отформатированной строкой "ключ — значение".

Примеры

Разбор лога в формате logfmt

Пример 125. Исходный код
parse_key_value!(
"@timestamp=\"Sun Jan 10 16:47:39 EST 2021\" level=info msg=\"Stopping all fetchers\" tag#production=stopping_fetchers id=ConsumerFetcherManager-1382721708341 module=kafka.consumer.ConsumerFetcherManager"
)
Пример 126. Результат
{
  "@timestamp": "Sun Jan 10 16:47:39 EST 2021",
  "level": "info",
  "msg": "Stopping all fetchers",
  "tag#production": "stopping_fetchers",
  "id": "ConsumerFetcherManager-1382721708341",
  "module": "kafka.consumer.ConsumerFetcherManager"
}

Разбор лога с разделителем запятой

Пример 127. Исходный код
parse_key_value!(
"path:\"/cart_link\", host:store.app.com, fwd: \"203.0.113.16\", dyno: web.1, connect:0ms, service:87ms, status:304, bytes:632, protocol:https",
field_delimiter: ",",
key_value_delimiter: ":"
)
Пример 128. Результат
{
  "path": "/cart_link",
  "host": "store.app.com",
  "fwd": "203.0.113.16",
  "dyno": "web.1",
  "connect": "0ms",
  "service": "87ms",
  "status": "304",
  "bytes": "632",
  "protocol": "https"
}

Разбор журнала с ключами без значений

Пример 129. Исходный код
parse_key_value!(
"env:prod,service:backend,region:eu-east1,beta",
field_delimiter: ",",
key_value_delimiter: ":",
)
Пример 130. Результат
{
  "env": "prod",
  "service": "backend",
  "region": "eu-east1",
  "beta": true
}

Разбор дублирующихся ключей

Пример 131. Исходный код
parse_key_value!(
"at=info,method=GET,path=\"/index\",status=200,tags=dev,tags=dummy",
field_delimiter: ",",
key_value_delimiter: "=",
)
Пример 132. Результат
{
  "at": "info",
  "method": "GET",
  "path": "/index",
  "status": "200",
  "tags": [
    "dev",
    "dummy"
  ]
}

parse_ruby_hash

Разбирает value как хэш Ruby.

Спецификация функции

parse_ruby_hash(value: <строка>)
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строковое представление хэша Ruby для разбора

да

Примечания

Эта функция имеет особое поведение, о котором следует знать.

  • Возвращаются только типы Ruby. Если нужно преобразовать строку в метку времени, используйте функцию parse_timestamp.

Ошибки

Функция parse_ruby_hash может возвращать ошибки, для которых требуется обработка:

  • value не является допустимым представлением хэша Ruby.

Примеры

Разбор хэша Ruby

Пример 133. Исходный код
parse_ruby_hash!(s'{ "test" => "value", "testNum" => 0.2, "testObj" => { "testBool" => true, "testNull" => nil } }')
Пример 134. Результат
{
  "test": "value",
  "testNum": 0.2,
  "testObj": {
    "testBool": true,
    "testNull": null
  }
}

parse_xml

Разбирает value как XML.

Спецификация функции

parse_xml(value: <строка>, [include_attr: <логическое значение>, attr_prefix: <строка>, text_key: <строка>, always_use_text_key: <логическое значение>, parse_bool: <логическое значение>, parse_null: <логическое значение>, parse_number: <логическое значение>])
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строковое представление XML-документа для разбора.

да

include_attr

логическое значение

Включать атрибуты XML-тегов в возвращаемый объект.

true

нет

attr_prefix

строка

Префикс строки для ключей атрибутов XML-тегов.

@

нет

text_key

строка

Имя ключа для расширенных текстовых узлов.

text

нет

always_use_text_key

логическое значение

Всегда возвращать узлы текста как {"<text_key>": "value"}.

false

нет

parse_bool

логическое значение

Разбирать "true" и "false" как логические значения.

true

нет

parse_null

логическое значение

Разбирать "null" как null.

true

нет

parse_number

логическое значение

Разбирать числа как целые/вещественные.

true

нет

Примечания

Эта функция имеет особое поведение, о котором следует знать.

  • Допустимый XML должен содержать ровно один корневой узел. Всегда возвращает объект.

Ошибки

Функция parse_xml может возвращать ошибки, для которых требуется обработка:

  • value не является правильным XML-документом

Примеры

Разбор XML

Пример 135. Исходный код
value = s'<book category="CHILDREN"><title lang="en">Harry Potter</title><author>J K. Rowling</author><year>2005</year></book>'

parse_xml!(value, text_key: "value", parse_number: false)
Пример 136. Результат
{
  "book": {
    "@category": "CHILDREN",
    "author": "J K. Rowling",
    "title": {
      "@lang": "en",
      "value": "Harry Potter"
    },
    "year": "2005"
  }
}

Функции разбора метаданных и параметров

parse_duration

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

Спецификация функции

parse_duration(value: <строка>, unit: <строка>)
:: <число с плавающей точкой> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка с длительностью.

да

unit

строка

Единица измерения для вывода длительности:

  • ns — наносекунды;

  • us, µs — микросекунды;

  • ms — миллисекунды;

  • cs — сантисекунды;

  • ds — децисекунды;

  • s — секунды;

  • m — минуты;

  • h — часы;

  • d — сутки.

да

Ошибки

Функция parse_duration может возвращать ошибки, для которых требуется обработка:

  • value не имеет правильного формата длительности

Примеры

Разбор длительности (миллисекунды)

Пример 137. Исходный код
parse_duration!("1005ms", unit: "s")
Пример 138. Результат
1.005

parse_query_string

Разбирает value как строку запроса (query string).

Спецификация функции

parse_query_string(value: <строка>)
:: <объект>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для разбора.

да

Примечания

Эта функция имеет особое поведение, о котором следует знать.

  • Все значения возвращаются как строки. Рекомендуется преобразовывать значения в нужные типы, используя соответствующие функции.

  • Пустые ключи и значения разрешены.

Примеры

Разбор строки запроса

Пример 139. Исходный код
parse_query_string("foo=%2B1&bar=2&bar=3&xyz")
Пример 140. Результат
{
  "bar": [
    "2",
    "3"
  ],
  "foo": "+1",
  "xyz": ""
}

Разбор строки запроса Ruby on Rails

Пример 141. Исходный код
parse_query_string("?foo%5b%5d=1&foo%5b%5d=2")
Пример 142. Результат
{
  "foo[]": [
    "1",
    "2"
  ]
}

parse_tokens

Разбирает value в формате "token". Токенами считаются такие последовательности символов:

  • Слова, окруженные пробелами.

  • Тексты, заключенные в двойные кавычки: "..". Кавычки можно включить в токен, если они экранированы обратной косой чертой (\).

  • Тексты, заключенные в квадратные скобки: [..]. Закрывающие квадратные скобки можно включить в токен, если они экранированы обратной косой чертой (\).

Спецификация функции

parse_tokens(value: <строка>)
:: <массив> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для токенизации.

да

Примечания

Эта функция имеет особое поведение, о котором следует знать.

  • Все значения токенов возвращаются как строки. Рекомендуется преобразовывать значения в нужные типы, используя соответствующие функции.

Ошибки

Функция parse_tokens может возвращать ошибки, для которых требуется обработка:

  • value не является правильно отформатированной строкой с токенами.

Примеры

Разбор токенов

Пример 143. Исходный код
parse_tokens(
"A sentence \"with \\\"a\\\" sentence inside\" and [some brackets]"
)
Пример 144. Результат
[
  "A",
  "sentence",
  "with \\\"a\\\" sentence inside",
  "and",
  "some brackets"
]

parse_url

Разбирает value в формате URL.

Спецификация функции

parse_url(value: <строка>, [default_known_ports: <логическое значение>])
:: <объект> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Текст URL.

да

default_known_ports

логическое значение

Заполнять ли номер порта значением по умолчанию. Если во входном URL не указан номер порта или он совпадает со стандартным, поле будет заполнено значением по умолчанию. Это применимо к протоколам http, https, ftp, ws и wss.

false

нет

Примечания

Особенности функции, о которых нужно знать:

  • По умолчанию, если во входном URL указан стандартный порт, он не учитывается. Поле port в возвращаемом объекте остается пустым.

Ошибки

Функция parse_url может возвращать ошибки, для которых требуется обработка:

  • value не является правильно отформатированным URL.

Примеры

Разбор URL

Пример 145. Исходный код
parse_url!("ftp://foo:bar@example.com:4343/foobar?hello=world#123")
Пример 146. Результат
{
  "scheme": "ftp",
  "username": "foo",
  "password": "bar",
  "host": "example.com",
  "port": 4343,
  "path": "/foobar",
  "query": {
    "hello": "world"
  },
  "fragment": "123"
}

Разбор URL с портом по умолчанию

Пример 147. Исходный код
parse_url!("https://example.com", default_known_ports: true)
Пример 148. Результат
{
  "scheme": "https",
  "username": "",
  "password": "",
  "host": "example.com",
  "port": 443,
  "path": "/",
  "query": {},
  "fragment": null
}

parse_user_agent

Разбирает value как строку пользовательского агента. Формат пользовательского агента имеет нечеткое определение, поэтому функция обеспечивает лишь максимально возможные результаты, а не точный разбор.

Спецификация функции

parse_user_agent(value: <строка>, [mode: <строка>])
:: <объект>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Строка для разбора.

да

mode

строка

Определяет характеристики производительности и надежности:

  • fast — самый быстрый, но менее надежный режим. Используется синтаксический анализатор из проекта Woothee.

  • reliable — обеспечивает большую надежность, чем режим fast, и в большинстве случаев не снижает скорость работы. Используется синтаксический анализатор Wood These. Если Wood These не разобрал какие-либо поля, используется анализатор uapproject.

  • enriched — объединяет результаты Wood These и uapproject.

fast

нет

Примечания

Эта функция имеет особое поведение, о котором следует знать:

  • Все значения возвращаются как строки или как null. Все значения возвращаются как строки. Рекомендуется преобразовывать значения в нужные типы, используя соответствующие функции.

  • Разные режимы возвращают разные схемы.

  • Поля, которые не были разобраны, устанавливаются как null.

Примеры

Быстрый режим

Пример 149. Исходный код
parse_user_agent(
"Mozilla Firefox 1.0.1 Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.7.6) Gecko/20050223 Firefox/1.0.1"
)
Пример 150. Результат
{
  "browser": {
    "family": "Firefox",
    "version": "1.0.1"
  },
  "device": {
    "category": "pc"
  },
  "os": {
    "family": "Linux",
    "version": null
  }
}

Надежный режим

Пример 151. Исходный код
parse_user_agent(
"Mozilla/4.0 (compatible; MSIE 7.66; Windows NT 5.1; SV1; .NET CLR 1.1.4322)",
mode: "reliable"
)
Пример 152. Результат
{
  "browser": {
    "family": "Internet Explorer",
    "version": "7.66"
  },
  "device": {
    "category": "pc"
  },
  "os": {
    "family": "Windows XP",
    "version": "NT 5.1"
  }
}

Расширенный режим

Пример 153. Исходный код
parse_user_agent(
"Opera/9.80 (J2ME/MIDP; Opera Mini/4.3.24214; iPhone; CPU iPhone OS 4_2_1 like Mac OS X; AppleWebKit/24.783; U; en) Presto/2.5.25 Version/10.54",
mode: "enriched"
)
Пример 154. Результат
{
  "browser": {
    "family": "Opera Mini",
    "major": "4",
    "minor": "3",
    "patch": "24214",
    "version": "10.54"
  },
  "device": {
    "brand": "Apple",
    "category": "smartphone",
    "family": "iPhone",
    "model": "iPhone"
  },
  "os": {
    "family": "iOS",
    "major": "4",
    "minor": "2",
    "patch": "1",
    "patch_minor": null,
    "version": "4.2.1"
  }
}

Функции преобразования IP

ip_aton

Преобразует IPv4-адрес в представлении чисел и точек в байты, представленные в сетевом порядке, как целое число.

Функция повторяет поведение функции inet_aton.

Спецификация функции

ip_aton(value: <строка>)
:: <целое число> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

IP-адрес для преобразования в бинарный формат.

да

Ошибки

Функция ip_aton может возвращать ошибки, для которых требуется обработка:

  • value не является допустимым IPv4-адресом.

Примеры

IPv4 в целое число

Пример 155. Исходный код
ip_aton!("233.252.0.4")
Пример 156. Результат
3925606404

ip_cidr_contains

Определяет, содержится ли ip в блоке, заданном с помощью cidr.

Спецификация функции

ip_cidr_contains(cidr: <строка>, ip: <строка>)
:: <логическое значение> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

cidr

строка

Маска CIDR (v4 или v6).

да

ip

строка

IP-адрес (v4 или v6).

да

Ошибки

Функция ip_cidr_contains может возвращать ошибки, для которых требуется обработка:

  • cidr не является допустимой маской CIDR.

  • ip не является допустимым IP-адресом.

Примеры

IPv4 содержит CIDR

Пример 157. Исходный код
ip_cidr_contains!("203.0.113.0/24", "203.0.113.32")
Пример 158. Результат
true

IPv6 содержит CIDR

Пример 159. Исходный код
ip_cidr_contains!("2001:db8:4:ba::/64", "2001:db8:4:ba:2e0:81ff:fe22:d1f1")
Пример 160. Результат
true

ip_ntoa

Преобразует числовое представление IPv4-адреса в байтах, представленных в сетевом порядке, в представление чисел и точек.

Функция повторяет поведение функции inet_ntoa.

Спецификация функции

ip_ntoa(value: <строка>)
:: <строка> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Целочисленное представление IPv4-адреса.

да

Ошибки

Функция ip_ntoa может возвращать ошибки, для которых требуется обработка:

  • value не может быть представлено в u32.

Примеры

Целое число в IPv4

Пример 161. Исходный код
ip_ntoa!(3925606404)
Пример 162. Результат
233.252.0.4

ip_ntop

Преобразует IPv4 и IPv6-адреса из бинарной формы в текстовую форму.

Функция повторяет поведение функции inet_ntop.

Спецификация функции

ip_ntop(value: <строка>)
:: <строка> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

Двоичные данные для преобразования. Для IPv4-адресов длина должна быть 4 байта (32 бита). Для IPv6-адресов длина должна быть 16 байт (128 бит).

да

Примечания

Эта функция имеет особое поведение, о котором стоит знать.

  • Двоичные данные для этой функции не всегда легко отобразить в печатном виде. Однако результаты функций, таких как decode_base64 или decode_percent, все равно можно использовать корректно.

Ошибки

Функция ip_ntop может возвращать ошибки, для которых требуется обработка:

  • value должно быть длиной 4 или 16 байт

Примеры

Преобразование IPv4-адреса из байтов после декодирования из Base64

Пример 163. Исходный код
ip_ntop!(decode_base64!("wKgAAQ=="))
Пример 164. Результат
192.168.0.1

Преобразование IPv6-адреса из байтов после декодирования из Base64

Пример 165. Исходный код
ip_ntop!(decode_base64!("IAENuIWjAAAAAIouA3BzNA=="))
Пример 166. Результат
2001:db8:85a3::8a2e:370:7334

ip_pton

Преобразует IPv4 и IPv6-адреса из текстовой формы в бинарную форму.

  • Бинарная форма IPv4-адресов имеет длину 4 байта (32 бита).

  • Бинарная форма IPv6-адресов имеет длину 16 байт (128 бит).

Функция повторяет поведение функции inet_pton.

Спецификация функции

ip_pton(value: <строка>)
:: <строка> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

value

строка

IP-адрес (v4 или v6) для преобразования в бинарную форму.

да

Примечания

Эта функция имеет особое поведение, о котором стоит знать.

  • Двоичные данные из этой функции не всегда могут быть удобочитаемыми. Однако результаты функций, таких как encode_base64 или encode_percent, все равно можно корректно обрабатывать.

Ошибки

Функция ip_pton может возвращать ошибки, для которых требуется обработка:

  • value не является допустимым IP-адресом (v4 или v6) в текстовой форме.

Примеры

Преобразование IPv4-адреса в байты и кодирование в Base64

Пример 167. Исходный код
encode_base64(ip_pton!("192.168.0.1"))
Пример 168. Результат
wKgAAQ==

Преобразование IPv6-адреса в байты и кодирование в Base64

Пример 169. Исходный код
encode_base64(ip_pton!("2001:db8:85a3::8a2e:370:7334"))
Пример 170. Результат
IAENuIWjAAAAAIouA3BzNA==

ip_subnet

Извлекает подсетевой адрес из ip с использованием заданной подсети (subnet).

Спецификация функции

ip_subnet(ip: <строка>, subnet: <строка>)
:: <строка> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

ip

строка

IP-адрес (v4 или v6).

да

subnet

строка

Подсеть, которую необходимо извлечь из IP-адреса. Это может быть либо длина префикса, например, /8, либо сетевая маска, например, 255.255.0.0. Сетевая маска может быть как IPv4, так и IPv6 адресом.

да

Примечания

Эта функция имеет особое поведение, о котором стоит знать.

  • Работает как с IPv4, так и с IPv6 адресами. Версия IP для маски должна быть такой же, как у предоставленного адреса.

Ошибки

Функция ip_subnet может возвращать ошибки, для которых требуется обработка:

  • ip не является допустимым IP-адресом.

  • subnet не является допустимой подсетью.

Примеры

Подсеть IPv4

Пример 171. Исходный код
ip_subnet!("192.168.10.32", "255.255.255.0")
Пример 172. Результат
192.168.10.0

Подсеть IPv6

Пример 173. Исходный код
ip_subnet!("2404:6800:4003:c02::64", "/32")
Пример 174. Результат
2404:6800::

ip_to_ipv6

Преобразует ip в адрес IPv6.

Спецификация функции

ip_to_ipv6(ip: <строка>)
:: <строка> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

ip

строка

IP-адрес, который необходимо преобразовать в IPv6.

да

Ошибки

Функция ip_to_ipv6 может возвращать ошибки, для которых требуется обработка:

  • ip не является допустимым IP-адресом.

Примеры

IPv4 в IPv6

Пример 175. Исходный код
ip_to_ipv6!("192.168.10.32")
Пример 176. Результат
::ffff:192.168.10.32

ipv6_to_ipv4

Преобразует ip в адрес IPv4. Если ip уже является IPv4-адресом, то он возвращается без изменений. Если ip в данный момент является IPv6-адресом, то он должен быть совместим с IPv4, в противном случае возникнет ошибка.

Спецификация функции

ipv6_to_ipv4(ip: <строка>)
:: <строка> , <ошибка>
Аргумент Тип Описание По умолчанию Обязателен

ip

строка

IPv4-совместимый IPv6-адрес для преобразования.

да

Ошибки

Функция ipv6_to_ipv4 может возвращать ошибки, для которых требуется обработка:

  • ip не является допустимым IP-адресом.

  • ip является IPv6-адресом, который не совместим с IPv4.

Примеры

IPv6 в IPv4

Пример 177. Исходный код
ipv6_to_ipv4!("::ffff:192.168.0.1")
Пример 178. Результат
192.168.0.1