Функции разбора
В данном разделе при описании функций приняты следующие обозначения:
|
Функции разбора согласно регулярному выражению
parse_regex
Разбирает строку value
с использованием предоставленного регулярного выражения pattern
. Эта функция отличается от функции parse_regex_all
тем, что ищет только первое совпадение.
VRL предоставляет специализированные функции для анализа распространенных форматов журналов. Поскольку регулярные выражения требуют больших ресурсов, рекомендуется использовать функцию parse_regex , только если нет специальной функции VRL для нужного формата.
|
Функция возвращает объект с полями, соответствующими именованным группам. При включенной опции numeric_groups
объект также включает поля, ключи которых являются последовательными номерами:
-
поле
"0"
содержит совпадение полностью; -
последующие поля содержат захваченные группы по порядку.
Все значения возвращаются как строки. Рекомендуется преобразовывать значения в нужные типы, используя соответствующие функции. |
Спецификация функции
parse_regex(value: <строка>, pattern: <регулярное выражение>, [numeric_groups: <логическое значение>])
:: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для поиска. |
да |
|
|
регулярное выражение |
Регулярное выражение для поиска. |
да |
|
|
логическое значение |
Если |
|
нет |
Если в |
Ошибки
Функция parse_regex
возвращает ошибку, для которой требуется обработка, если строку value
не удалось разобрать с использованием предоставленного шаблона pattern
.
Примеры
Разбор с использованием регулярного выражения с захватом именованной группы
parse_regex!("Connection attempt from 192.0.2.0, from 192.0.2.1.",
r'from (?P<ip>\d+\.\d+\.\d+\.\d+)')
{
"ip": "192.0.2.0"
}
Разбор с использованием регулярного выражения без захвата именованных групп
parse_regex!("Connection attempt from 192.0.2.0, from 192.0.2.1.",
r'from (\d+\.\d+\.\d+\.\d+)',
numeric_groups: true)
{
"0": "from 192.0.2.0",
"1": "192.0.2.0"
}
parse_regex_all
Разбирает value
с использованием предоставленного регулярного выражения pattern
. Эта функция отличается от функции parse_regex
тем, что ищет все совпадения, а не только первое.
VRL предоставляет функции специального назначения для разбора общих форматов журналов. Прежде чем использовать функцию parse_regex_all , проверьте, существует ли уже функция VRL, которая разбирает нужный формат.
|
Функция возвращает массив объектов с полями, соответствующими именованным группам. При включенной опции numeric_groups
объекты также включают поля, ключи которых являются последовательными номерами:
-
поле
"0"
содержит совпадение полностью; -
последующие поля содержат захваченные группы по порядку.
Все значения возвращаются как строки. Рекомендуется преобразовывать значения в нужные типы, используя соответствующие функции. |
Спецификация функции
parse_regex_all(value: <строка>, pattern: <регулярное выражение>, [numeric_groups: <логическое значение>]) :: <массив>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для поиска. |
да |
|
|
регулярное выражение |
Регулярное выражение для поиска. |
да |
|
|
логическое значение |
Если |
|
нет |
Если в pattern нет именованных групп и значение numeric_groups равно false , функция возвращает массив пустых объектов.
|
Ошибки
Функция parse_regex_all
возвращает ошибку, для которой требуется обработка, если value
не удалось разобрать с использованием предоставленного шаблона pattern
.
Примеры
Разбор с использованием регулярного выражения (все совпадения)
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)
[ { "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
.
Отсутствие информации в сообщении журнала может быть обозначено - . Эти поля опуcкаются в результате, возвращаемом функцией.
|
Спецификация функции
parse_apache_log(value: <строка>, format: <строка>, [timestamp_format: <строка>]) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для разбора. |
да |
|
|
строка |
Формат, используемый для разбора журнала. |
да |
|
|
строка |
Формат даты и времени, используемый для кодирования метки времени. Время разбирается в локальном часовом поясе, если метка времени не указывает часовой пояс. |
|
нет |
Ошибки
Функция parse_apache_log
может возвращать ошибки, для которых требуется обработка:
-
value
не соответствует указанному формату; -
timestamp_format
не является допустимой строкой формата; -
метку времени в
value
не удалось разобрать с использованием предоставленного форматаtimestamp_format
.
Примеры
Разбор строки в формате журнала Apache (common)
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")
{
"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)
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")
{
"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 (ошибка)
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")
{
"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 .
|
Тип Decimal в сообщениях Avro не поддерживается.
|
Спецификация функции
rv_parse_avro(value: <строка>, [reader_schema: <строка>])
:: <массив объектов>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строковое представление сообщения Avro |
да |
|
|
JSON |
Схема для считывания в формате JSON. Строка должна быть представлена литералом, без использования переменных. |
нет |
Использование схемы считывания, заданной в параметре reader_schema , может замедлить выполнение функции.
|
Ошибки
Функция rv_parse_avro
может возвращать ошибки, для которых требуется обработка:
-
value
не является корректным сообщением Avro; -
value
закодировано не в UTF-8; -
reader_schema
не является строкой; -
невозможно разобрать предоставленную
reader_schema
; -
значения типов
TimeMicros
,TimeMillis
,Float
иDouble
в разобранном сообщении не являются числовыми.
Примеры
Базовый разбор
# .message -- путь к сообщению в формате Avro.
rv_parse_avro!(.message)
# Пример массива объектов. [ { "entity": "001", "time": "1433269388" }, { "entity": "002", "time": "1433270488" }, ]
С указанием схемы
# .message -- путь к сообщению в формате Avro.
rv_parse_avro!(.message,
reader_schema: s'{"type": "record", "fields": [{"name": "element", "type": "string"}, {"name": "time", "type": "string"}]}')
# Пример массива объектов. [ { "element": "001", "time": "1433269388" }, { "element": "002", "time": "1433270488" }, ]
rv_parse_avro_raw
Разбирает value
как отдельную запись Apache Avro, сериализованную без заголовков или встроенной схемы. Функция требует предоставлять схему расшифровки данных.
Тип Decimal в сообщениях Avro не поддерживается.
|
Спецификация функции
rv_parse_avro_raw(value: <строка>, decoder_schema: <avro_schema>, [reader_schema: <строка>])
:: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строковое представление сообщения Avro |
да |
|
|
строка |
Схема для расшифровки данных. Строка должна быть представлена литералом, без использования переменных. |
да |
|
|
JSON |
Схема в формате JSON для валидации расшифрованных данных. Строка должна быть представлена литералом, без использования переменных. |
нет |
Использование схемы считывания, заданной в параметре reader_schema , может замедлить выполнение функции.
|
Ошибки
Функция rv_parse_avro_raw
может возвращать ошибки, для которых требуется обработка:
-
value
не является корректным сообщением Avro; -
decoder_schema
не является строкой; -
reader_schema
не является строкой; -
невозможно разобрать предоставленную
decoder_schema
; -
невозможно разобрать предоставленную
reader_schema
; -
значения типов
TimeMicros
,TimeMillis
,Float
иDouble
в разобранном сообщении не являются числовыми.
Примеры
Базовый разбор
# .message -- путь к сообщению в формате Avro.
rv_parse_avro_raw!(.message,
decoder_schema: s'{"type": "record", "fields": [{"name": "element", "type": "string"}, {"name": "time", "type": "string"}]}')
# Пример объекта. { "element": "value", "time": "1433270488" }
С указанием схемы считывания
# .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"}]}')
# Пример объекта. { "element": "value" }
parse_aws_alb_log
Разбирает value
в формате журнала доступа Application Load Balancer в AWS (Amazon Web Services).
Спецификация функции
parse_aws_alb_log(value: <строка>) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Журнал доступа Application Load Balancer. |
да |
Ошибки
Функция parse_aws_alb_log
возвращает ошибку, для которой требуется обработка, если value
не соответствует указанному формату лога AWS ALB.
Пример
Разбор лога AWS ALB
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\" \"-\" \"-\" \"-\" \"-\" \"-\" \"-\""
)
{
"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: <строка>) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строковое представление сообщения для разбора. |
да |
Ошибки
Функция parse_aws_cloudwatch_log_subscription_message
возвращает ошибку, для которой требуется обработка, если value
не является правильно отформатированным сообщением подписки AWS Cloudwatch Log.
Пример
Разбор сообщения подписки AWS Cloudwatch Log
# .message -- пример пути к сообщению журнала AWS CloudWatch.
parse_aws_cloudwatch_log_subscription_message!(.message)
{
"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: <строка>]) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Журнал потоков VPC. |
да |
|
|
строка |
Формат журнала потоков VPC. |
нет |
Ошибки
Функция parse_aws_vpc_flow_log
возвращает ошибку, для которой требуется обработка, если value
имеет неправильный формат журнала потоков VPC AWS.
Примеры
Разбор журнала потоков VPC AWS в формате по умолчанию
parse_aws_vpc_flow_log!("2 123456789010 eni-1235b8ca123456789 - - - - - - - 1431280876 1431280934 - NODATA")
{
"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 в пользовательском формате
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"
)
{
"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: <логическое значение>]) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для разбора |
да |
|
|
логическое значение |
Преобразовывать пользовательские пары полей в формат |
|
нет |
Ошибки
Функция parse_cef
возвращает ошибку, для которой требуется обработка, если value
имеет неправильный формат строки CEF.
Примеры
Разбор сообщения, сгенерированного Privileged Threat Analytics (PTA)
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"
)
{
"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, которое игнорируется
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"
)
{
"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"
}
Преобразование пользовательских полей
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
)
{
"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: <строка>)
:: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строковое представление записи CEF |
да |
Ошибки
Функция rv_parse_cef
может возвращать ошибки, для которых требуется обработка:
-
строка
value
не начинается с обязательного префиксаCEF:
; -
строка
value
не содержит обязательных полей и не является корректной записью CEF.
Примеры
Базовый разбор
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')
{
"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
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)
{
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).
Отсутствие информации в сообщении журнала может быть обозначено - . Эти поля опуcкаются в результате, возвращаемом функцией.
|
Спецификация функции
parse_common_log(value: <строка>, [timestamp_format: <строка>]) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для разбора. |
да |
|
|
строка |
Формат даты и времени для кодирования метки времени. |
|
нет |
Ошибки
Функция parse_common_log
может возвращать ошибки, для которых требуется обработка:
-
value
не соответствует формату общего журнала. -
timestamp_format
не является допустимой строкой формата. -
Метку времени в
value
не удается разобрать с использованием предоставленного форматаtimestamp_format
.
Примеры
Разбор сообщения в формате общего журнала (с форматом метки времени по умолчанию)
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")
{
"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
}
Разбор сообщения в формате общего журнала с пользовательским форматом метки времени
parse_common_log!(
"192.0.2.25 bob frank [2000-10-10T20:55:36Z] \"GET /apache_pb.gif HTTP/1.0\" 200 2326",
"%+"
)
{
"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: <строка>)
:: <строка>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строковое представление записи DIT |
да |
Ошибки
Функция rv_extract_from_dit
может возвращать ошибки, для которых требуется обработка:
-
value
закодировано не в UTF-8. -
value
не является корректной записью DIT.
Пример
rv_extract_from_dit!("CN=Dev-India,OU=Distribution Groups,DC=gp,DC=gl,DC=example,DC=com")
{
"domain": "gp.gl.example.com",
"username": "dev-india"
}
parse_etld
Разбирает eTLD (effective top-level domain) из строки value
, представляющей собой доменное имя.
Спецификация функции
parse_etld(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
parse_etld!("sub.example.com")
{
"etld": "com",
"etld_plus": "com",
"known_suffix": true
}
Разбор eTLD+1
parse_etld!("example.com", plus_parts: 1)
{
"etld": "com",
"etld_plus": "example.com",
"known_suffix": true
}
Разбор eTLD с неизвестным суффиксом
parse_etld!("example.acmecorp")
{
"etld": "acmecorp",
"etld_plus": "acmecorp",
"known_suffix": false
}
Разбор eTLD с другим PSL
parse_etld!("example.acmecorp",
# Пример пути к списку доменов.
psl: "resources/public_suffix_list.dat")
{
"etld": "acmecorp",
"etld_plus": "acmecorp",
"known_suffix": false
}
dns_lookup
Выполняет DNS Lookup для доменного имени value
.
Не рекомендуется применять Избегайте использования этой функции в контекстах, чувствительных к задержке, из-за возможных сетевых задержек или сбоев. |
Спецификация функции
dns_lookup(value: <строка>, [qtype: <строка>, qclass: <строка>, options: <объект>])
:: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Доменное имя. |
да |
|
|
строка |
Тип искомой записи DNS. |
нет |
|
|
строка |
Класс сети, для которой выполняется поиск DNS-записей. |
|
нет |
|
строка |
Опции поиска. |
нет |
Ошибки
Функция dns_lookup
может возвращать ошибки, для которых требуется обработка:
-
Невозможно разобрать имя хоста
value
. -
Невозможно разобрать тип запроса
qtype
. -
Невозможно разобрать класс сети
qclass
. -
Не удалось выполнить запрос DNS Lookup.
Примеры
Базовый поиск
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
{
"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
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
{
"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"
}
Заданные опции
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
{
"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-сервер
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
{
"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: <строка>) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для разбора. |
да |
Ошибки
Функция parse_glog
возвращает ошибку, для которой требуется обработка, если value
не соответствует формату glog
.
Пример
Разбор через формат glog
parse_glog!("I20210131 14:48:54.411655 15520 main.c++:9] Hello world!")
{
"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: <строка>) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для разбора. |
да |
|
|
строка |
Шаблон Grok. |
да |
Ошибки
Функция parse_grok
возвращает ошибку, для которой требуется обработка, если value
не удается разобрать с использованием предоставленного шаблона pattern
.
Пример
Разбор с использованием Grok
parse_grok!(
"2020-10-02T23:22:12.223222Z info Hello world",
"%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}"
)
{
"level": "info",
"message": "Hello world",
"timestamp": "2020-10-02T23:22:12.223222Z"
}
parse_groks
Разбирает value
, используя несколько шаблонов grok
. Поддерживаются все шаблоны grok.
Рекомендуется использовать шаблоны Grok, которые поддерживаются сообществом. Такие шаблоны, скорее всего, будут проверены и улучшены в будущем, в отличие от пользовательских шаблонов. |
Спецификация функции
parse_groks(value: <строка>, patterns: <массив>, [aliases: <объект>, alias_sources: <массив>])
:: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для разбора. |
да |
|
|
массив |
Шаблоны Grok, которые применяются последовательно до первого совпадения. |
да |
|
|
объект |
Общий набор псевдонимов Grok, на которые можно ссылаться в шаблонах для их упрощения. |
нет |
|
|
массив строк |
Пути к файлам, содержащим псевдонимы в формате JSON. |
нет |
Ошибки
Функция parse_groks
может возвращать ошибки, для которых требуется обработка:
-
value
не удается разобрать с использованием предоставленных шаблонов; -
patterns
не является массивом; -
aliases
не является объектом; -
элемент массива
alias_sources
не является строкой или не указывает на корректный файл.
Пример
Разбор с использованием нескольких шаблонов Grok
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}"
})
{
"level": "info",
"message": "Hello world",
"timestamp": "2020-10-02T23:22:12.223222Z"
}
parse_influxdb
Разбирает value
как строку протокола строк InfluxDB, создавая список метрик, совместимых с Vector.
|
Спецификация функции
parse_influxdb(value: <строка> )
:: <массив>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строковое представление протокола строк InfluxDB для разбора. |
да |
Ошибки
Функция parse_influxdb
может возвращать ошибки, для которых требуется обработка:
-
value
— не валидная строка протокола строк InfluxDB. -
Список полей содержит поле типа
строка
. -
Список полей содержит значение поля
NaN
.
Пример
Разбор протокола строк InfluxDB
parse_influxdb!("cpu,host=A,region=us-west usage_system=64i,usage_user=10u,temperature=50.5,on=true,sleep=false 1590488773254420000")
[ { "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: <строка>) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для разбора. |
да |
Ошибки
Функция parse_klog
возвращает ошибку, для которой требуется обработка, если value
не соответствует формату klog
.
Пример
Разбор по формату klog
parse_klog!("I0505 17:59:40.692994 28133 klog.go:70] hello from klog")
{
"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: <строка>)
:: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строковое представление сообщения LEEF |
да |
Ошибки
Функция rv_parse_leef
может возвращать ошибки, для которых требуется обработка:
-
value
не является корректным сообщением LEEF.
Пример
Сообщение LEEF с заголовком syslog и атрибутами события, разделенными символом ^
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")
{
"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: <строка>) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Текст, содержащий сообщение для разбора. |
да |
Ошибки
Функция parse_linux_authorization
возвращает ошибку, для которой требуется обработка, если value
не является правильно отформатированным сообщением syslog.
Пример
Разбор события авторизации Linux
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'
)
{
"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: <строка>) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для разбора. |
да |
Ошибки
Функция parse_logfmt
возвращает ошибку, для которой требуется обработка, если value
не является правильно отформатированной строкой "ключ — значение" (logfmt).
Пример
Разбор лога в формате logfmt
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"
)
{
"@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: <строка>)
:: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строковое представление MessagePack |
да |
Ошибки
Функция rv_parse_msgpack
может возвращать ошибки, для которых требуется обработка:
-
value
не является массивом байтов.
Примеры
Преобразование массива байтов
# .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)
{
"int": 1,
"float": 0.5,
"boolean": true,
"null": null,
"string": "foo bar",
"array": [
"foo",
"bar"
],
"object": {
"foo": 1,
"baz": 0.5
}
Преобразование после декодирования из Base64
rv_parse_msgpack!(decode_base64!("3wAAAAGlZmllbGSldmFsdWU="))
{
"field": "value"
}
rv_parse_msgpack_batch
Разбирает value
, которое состоит из нескольких сообщений в формате MessagePack.
|
Спецификация функции
rv_parse_msgpack_batch(value: <строка>)
:: <массив объектов>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строковое представление пакета объектов MessagePack |
да |
Ошибки
Функция rv_parse_msgpack_batch
может возвращать ошибки, для которых требуется обработка:
-
value
не является массивом байтов.
Примеры
Преобразование массива байтов
# .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)
[ { "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
rv_parse_msgpack_batch(decode_base64!("3wAAAAGlZmllbGSldmFsdWXfAAAAAaVmaWVsZKV2YWx1ZQ=="))
[ { "field": "value" }, { "field": "value" } ]
rv_parse_netflow
Разбирает value
в формате пакетов NetFlow.
Спецификация функции
rv_parse_netflow(value: <строка>)
:: <массив объектов>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строковое представление пакетов NetFlow. |
да |
Ошибки
Функция rv_parse_netflow
может возвращать ошибки, для которых требуется обработка:
-
value
не является правильным NetFlow пакетом
Пример
Разбор пакетов NetFlow
rv_parse_netflow!(decode_base64!("AAUCAAMABAAFAAYHCAkAAQIDBAUGBwgJAAECAwQFBgcICQABAgMEBQYHCAkAAQIDBAUGBwgJAAECAwQFBgcICQABAgMEBQYH"))
[ { "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
, ingress_upstreaminfo
, main
или error
.
Отсутствие информации в сообщении журнала может быть обозначено - . Эти поля опуcкаются в результате, возвращаемом функцией.
|
Спецификация функции
parse_nginx_log(value: <строка>, format: <строка>, [timestamp_format: <строка>])
:: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для разбора. |
да |
|
|
строка |
Формат, используемый для разбора журнала. |
да |
|
|
строка |
Формат даты/времени, используемый для кодирования метки времени. Если в метке времени не указан часовой пояс, время разбирается как локальное. Формат по умолчанию |
|
нет |
Ошибки
Функция parse_nginx_log
может возвращать ошибки, для которых требуется обработка:
-
value
не соответствует указанному формату. -
timestamp_format
не является допустимой строкой формата. -
Метка времени в
value
не удается разобрать с использованием предоставленного форматаtimestamp_format
.
Примеры
Разбор в формате журнала Nginx (комбинированном)
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",
)
{
"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
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"
)
{
"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: <строка>)
:: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Полезная нагрузка Protocol Buffers для разбора. |
да |
|
|
строка |
Путь к файлу набора дескрипторов Protocol Buffers. Должен быть строковым литералом.
Этот файл является результатом работы команды |
да |
|
|
строка |
Имя типа сообщения, используемого для сериализации. Должно быть строковым литералом. |
да |
Примечание
Функция разбирает и возвращает только сообщения (message) Protocol Buffers.
Ошибки
Функция encode_proto
может возвращать ошибки, для которых требуется обработка:
-
value
не является валидным payload Protocol Buffers. -
Файл, указанный в аргументе
desc_file
, не существует. -
Тип сообщения, указанный в аргументе
message_type
, отсутствует в файле дескрипторов.
Пример
.payload = encode_base64(encode_proto!({"name": "someone", "phones": [{"number": "123456"}]}, "resources/protobuf_descriptor_set.desc", "test_protobuf.Person"))
Cgdzb21lb25lIggKBjEyMzQ1Ng==
rv_parse_qradar
Разбирает value
в формате QRadar, включая необязательный заголовок syslog.
Спецификация функции
rv_parse_qradar(value: <строка>)
:: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строковое представление сообщения QRadar |
да |
Ошибки
Функция rv_parse_qradar
может возвращать ошибки, для которых требуется обработка:
-
value
закодировано не в UTF-8; -
value
содержит ключ без соответствующего значения.
Примеры
Разбор сообщения без заголовка syslog и со вложенным полем Message
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())
{
"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
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())
{
"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: <строка>) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Текст, содержащий сообщение syslog для разбора. |
да |
Ошибки
Функция parse_syslog
возвращает ошибку, для которой требуется обработка, если value
не является правильно отформатированным сообщением syslog.
Пример
Разбор журнала Syslog (5424)
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!'
)
{
"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: <целое число>) :: <строка>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
целое число |
Код устройства. |
да |
Ошибки
Функция to_syslog_facility
возвращает ошибку, для которой требуется обработка, если value
не является допустимым кодом устройства Syslog.
Пример
Приведение к устройству Syslog
to_syslog_facility!(4)
auth
to_syslog_facility_code
Преобразует value
из ключевого слова Syslog в соответствующий ему код устройства Syslog (от 0
до 23
).
Спецификация функции
to_syslog_facility_code(value: <строка>)
:: <целое число>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Ключевое слово Syslog. |
да |
Ошибки
Функция to_syslog_facility_code
возвращает ошибку, если value
не является допустимым ключевым словом Syslog.
Пример
Приведение к ключевому слову Syslog
to_syslog_facility_code!("authpriv")
10
to_syslog_level
Преобразует value
из кода уровня серьезности Syslog в соответствующее ключевое слово, например, 0
в "emerg"
, 1
— в "alert"
.
Спецификация функции
to_syslog_level(value: <целое число>) :: <строка>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
целое число |
Код уровня серьезности. |
да |
Ошибки
Функция to_syslog_level
возвращает ошибку, для которой требуется обработка, если value
не является допустимым кодом уровня серьезности Syslog.
Пример
Приведение к уровню Syslog
to_syslog_level!(5)
notice
to_syslog_severity
Преобразует value
, ключевое слово уровня Syslog, в целое число уровня серьезности Syslog (0
до 7
).
Спецификация функции
to_syslog_severity(value: <строка>) :: <целое число>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Ключевое слово уровня Syslog для преобразования. |
да |
Ошибки
Функция to_syslog_severity
возвращает ошибку, для которой требуется обработка, если value
не является допустимым ключевым словом уровня Syslog.
Пример
Приведение к уровню серьезности Syslog
to_syslog_severity!("alert")
1
Функции разбора структурированных данных
parse_cbor
Разбирает value
в формате CBOR.
Спецификация функции
parse_cbor(value: <строка>)
:: <двоичное значение | целое число | число с плавающей точкой | строка | объект | массив | пустое значение>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Полезная нагрузка CBOR для разбора. |
да |
Функция возвращает только типы CBOR. |
Ошибки
Функция parse_csv
возвращает ошибку, для которой требуется обработка, если value
не является допустимой полезной нагрузкой CBOR.
Пример
Разбор CBOR
parse_cbor!(decode_base64!("oWVmaWVsZGV2YWx1ZQ=="))
{
"field": "value"
}
parse_csv
Разбирает отдельную строку в формате CSV. Если входное значение состоит из нескольких строк, будет проанализирована только первая строка.
Все значения возвращаются как строки. Рекомендуется преобразовывать значения в нужные типы, используя соответствующие функции. |
Спецификация функции
parse_csv(value: <строка>, [delimiter: <строка>])
:: <массив>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для разбора. |
да |
|
|
строка |
Разделитель полей для использования при разборе. Должен быть однобайтовым символом UTF-8. |
|
нет |
Ошибки
Функция parse_csv
может возвращать ошибки, для которых требуется обработка:
-
Разделитель не является однобайтовым символом UTF-8.
-
value
не является допустимой строкой CSV.
Примеры
Разбор отдельной строки в формате CSV
parse_csv!("foo,bar,\"foo \"\", bar\"")
[ "foo", "bar", "foo \", bar" ]
Разбор отдельной строки в формате CSV с пользовательским разделителем
parse_csv!("foo bar", delimiter: " ")
[ "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: <логическое значение>])
:: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
HTML-документ в виде строки. |
да |
|
|
логическое значение |
Удалять пробелы вокруг элементов HTML. |
|
нет |
|
логическое значение |
Включать атрибуты HTML в возвращаемый объект. |
|
нет |
|
строка |
Префикс строки для ключей атрибутов HTML. |
|
нет |
|
строка |
Ключ, под которым возвращается содержимое элементов HTML. |
|
нет |
|
логическое значение |
Всегда возвращать содержимое элементов HTML под ключом, указанным в параметре |
|
нет |
|
логическое значение |
Интерпретировать строки |
|
нет |
|
логическое значение |
Интерпретировать пустые строки и строки |
|
нет |
|
логическое значение |
Интерпретировать строковые представления чисел ( |
|
нет |
Ошибки
Функция rv_parse_html
может возвращать ошибки, для которых требуется обработка:
-
value
не является корректным документом HTML.
Примеры
С указанием text_key, без разбора числовых типов
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)
{
"book": {
"@category": "PROGRAMMING",
"author": "Steve Klabnik, Carol Nichols",
"title": {
"@lang": "en",
"value": "The Rust programming language"
},
"year": "2019"
}
}
С использованием text_key во всех случаях
value = s'<b>test</b>'
rv_parse_html!(value,
text_key: "value",
text_key: "node",
always_use_text_key: true)
{
"b": {
"node": "test"
}
}
Без удаления пробелов между элементами
value = s'<root> <a>test</a> </root>'
rv_parse_html!(value, trim: false)
{
"root": {
"a": "test",
"text": [
" ",
" "
]
}
}
parse_json
Разбирает value
как JSON.
Возвращаются только типы JSON. Если нужно преобразовать string в timestamp , используйте функцию parse_timestamp .
|
Чтобы извлечь содержимое из поврежденного JSON, используйте функцию rv_json_extract_payload .
|
Спецификация функции
parse_json(value: <строка>, [max_depth: <целое число>, lossy: <логическое значение>]) :: <логическое значение | целое число | число с плавающей точкой | строка | объект | массив | пустое значение>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка с представлением JSON для разбора. |
да |
|
|
целое число |
Количество уровней для разбора вложенных JSON-документов. Значение должно быть в диапазоне от 1 до 128. |
нет |
|
|
логическое значение |
Разбирать ли JSON способом с потерями. Если аргумент установлен в |
|
нет |
Ошибки
Функция parse_json
возвращает ошибку, для которой требуется обработка, если value
не является допустимым JSON-представлением.
Примеры
Разбор JSON
parse_json!("{\"key\": \"val\"}")
{
"key": "val"
}
Разбор JSON с ограничением глубины
parse_json!("{\"top_level\":{\"key\": \"val\"}}",
max_depth: 1)
{
"top_level": "{\"key\": \"val\"}"
}
rv_json_extract_payload
Извлекает значение ключа payload_key
из поврежденного или невалидного JSON.
Если указанный ключ встречается несколько раз, то будет извлечено значение только первого вхождения. |
Спецификация функции
rv_json_extract_payload(value: <строка>, payload_key: <строка>)
:: <логическое значение | целое число | число с плавающей точкой | строка | объект | массив | пустое значение>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка с представлением JSON для извлечения |
да |
|
|
строка |
Ключ, значение которого нужно извлечь |
да |
Ошибки
Функция rv_json_extract_payload
может возвращать ошибку, для которой требуется обработка, если value
не содержит ключ payload_key
.
Примеры
JSON с валидной структурой
rv_json_extract_payload(s'{"a": 123, "payload" : "data"}',
payload_key: "payload")
"data"
JSON с невалидной структурой
rv_json_extract_payload(s'"asd":123,"payload" : "text"',
payload_key: "payload")
"text"
Несколько ключей payload_key
:
rv_json_extract_payload(s'{ asd":123,"payload" : "first", "payload": "second" }', payload_key: "payload")
"first"
parse_key_value
Разбирает value
в формате "ключ — значение", также известном как logfmt. Ключи и значения могут быть заключены в кавычки "
.
Символы Все значения возвращаются как строки или как массивы строк для дублирующихся ключей. Рекомендуется преобразовывать значения в нужные типы, используя соответствующие функции. |
Спецификация функции
parse_key_value(value: <строка>, [key_value_delimiter: <строка>, field_delimiter: <строка>, whitespace: <строка>, accept_standalone_key: <логическое значение>]) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для разбора. |
да |
|
|
строка |
Строка, разделяющая ключ и значение. |
|
нет |
|
строка |
Строка, разделяющая каждую пару "ключ — значение". |
(пробел) |
нет |
|
строка |
Обработка пробелов вокруг разделителя, заданного в параметре
|
|
нет |
|
логическое значение |
Разрешены ли ключи без значений. Если такие ключи разрешены, в возвращаемом объекте им будет присвоено значение |
|
нет |
Ошибки
Функция parse_key_value
возвращает ошибку, для которой требуется обработка, если value
не является правильно отформатированной строкой "ключ — значение".
Примеры
Разбор лога в формате logfmt
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"
)
{
"@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"
}
Разбор лога с разделителем запятой
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: ":"
)
{
"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"
}
Разбор журнала с ключами без значений
parse_key_value!(
"env:prod,service:backend,region:eu-east1,beta",
field_delimiter: ",",
key_value_delimiter: ":",
)
{
"env": "prod",
"service": "backend",
"region": "eu-east1",
"beta": true
}
Разбор дублирующихся ключей
parse_key_value!(
"at=info,method=GET,path=\"/index\",status=200,tags=dev,tags=dummy",
field_delimiter: ",",
key_value_delimiter: "=",
)
{
"at": "info",
"method": "GET",
"path": "/index",
"status": "200",
"tags": [
"dev",
"dummy"
]
}
parse_ruby_hash
Разбирает value
как хэш Ruby.
Возвращаются только типы Ruby. Если нужно преобразовать строку в метку времени , используйте функцию parse_timestamp .
|
Спецификация функции
parse_ruby_hash(value: <строка>) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строковое представление хэша Ruby для разбора |
да |
Ошибки
Функция parse_ruby_hash
возвращает ошибку, для которой требуется обработка, если value
не является допустимым представлением хэша Ruby.
Пример
Разбор хэша Ruby
parse_ruby_hash!(s'{ "test" => "value", "testNum" => 0.2, "testObj" => { "testBool" => true, "testNull" => nil } }')
{
"test": "value",
"testNum": 0.2,
"testObj": {
"testBool": true,
"testNull": null
}
}
parse_xml
Разбирает value
как XML.
Допустимый XML должен содержать ровно один корневой узел. Функция всегда возвращает объект. |
Спецификация функции
parse_xml(value: <строка>, [include_attr: <логическое значение>, attr_prefix: <строка>, text_key: <строка>, always_use_text_key: <логическое значение>, parse_bool: <логическое значение>, parse_null: <логическое значение>, parse_number: <логическое значение>]) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строковое представление XML-документа для разбора. |
да |
|
|
логическое значение |
Включать атрибуты XML-тегов в возвращаемый объект. |
|
нет |
|
строка |
Префикс строки для ключей атрибутов XML-тегов. |
|
нет |
|
строка |
Имя ключа для расширенных текстовых узлов. |
|
нет |
|
логическое значение |
Всегда возвращать узлы текста как |
|
нет |
|
логическое значение |
Разбирать "true" и "false" как логические значения. |
|
нет |
|
логическое значение |
Разбирать "null" как |
|
нет |
|
логическое значение |
Разбирать числа как целые/вещественные. |
|
нет |
Ошибки
Функция parse_xml
возвращает ошибку, для которой требуется обработка, если value
не является правильным XML-документом
Пример
Разбор XML
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)
{
"book": {
"@category": "CHILDREN",
"author": "J K. Rowling",
"title": {
"@lang": "en",
"value": "Harry Potter"
},
"year": "2005"
}
}
Функции разбора метаданных и параметров
parse_bytes
Разбирает value
как количество информации в указанных единицах измерения.
Спецификация функции
parse_bytes(value: <строка>, unit: <строка>, [base: <строка>]) :: <число с плавающей точкой>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Количество информации в двоичных единицах измерения либо единицах СИ. |
да |
|
|
cтрока |
Единицы, в которые нужно перевести объем. |
да |
|
|
строка |
Система приставок, используемая при неоднозначных обозначениях:
|
|
нет |
Используемые обозначения представлены в теблице:
Обозначение | Десятичные единицы | Двоичные единицы |
---|---|---|
|
байт |
|
|
килобайт |
|
|
кибибайт |
|
|
мегабайт |
мебибайт ( |
|
гигабайт |
гибибайт ( |
|
терабайт |
тебибайт ( |
|
петабайт |
пебибайт ( |
|
эксабайт |
эксбибайт ( |
Ошибки
Функция parse_bytes
возвращает ошибку, если value
не является объемом информации в правильном формате.
Примеры
Перевод кибибайтов в число мебибайт
parse_bytes!("1024KiB", unit: "MiB")
1
Перевод терабайтов в число мегабайт
parse_bytes!("4TB", unit: "MB", base: "10")
4000000
Перевод ГБ в число байт с указанием используемой системы
parse_bytes!("1GB", unit: "B", base: "2")
1073741824
parse_duration
Разбирает value
в удобочитаемый формат длительности, используя единицы, указанные в параметре unit
.
Спецификация функции
parse_duration(value: <строка>, unit: <строка>)
:: <число с плавающей точкой>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка с длительностью. Должна состоять из пар чисел и единиц измерения. |
да |
|
|
строка |
Единица измерения для вывода длительности. |
да |
Используемые единицы измерения:
-
ns
— наносекунды; -
us
,µs
— микросекунды; -
ms
— миллисекунды; -
cs
— сантисекунды; -
ds
— децисекунды; -
s
— секунды; -
m
— минуты; -
h
— часы; -
d
— сутки.
Ошибки
Функция parse_duration
возвращает ошибку, для которой требуется обработка, если value
не имеет правильного формата длительности
Примеры
Преобразование миллисекунд в секунды
parse_duration!("1005ms", unit: "s")
1.005
Преобразование секунд и минут в миллисекунды
parse_duration!("1s1m", unit: "ms")
61000
parse_query_string
Разбирает value
как строку запроса (query string).
|
Спецификация функции
parse_query_string(value: <строка>) :: <объект>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для разбора. |
да |
Примеры
Разбор строки запроса
parse_query_string("foo=%2B1&bar=2&bar=3&xyz")
{
"bar": [
"2",
"3"
],
"foo": "+1",
"xyz": ""
}
Разбор строки запроса Ruby on Rails
parse_query_string("?foo%5b%5d=1&foo%5b%5d=2")
{
"foo[]": [
"1",
"2"
]
}
parse_tokens
Разбирает value
в формате "token". Токенами считаются такие последовательности символов:
-
Слова, окруженные пробелами.
-
Тексты, заключенные в двойные кавычки:
".."
. Кавычки можно включить в токен, если они экранированы обратной косой чертой (\
). -
Тексты, заключенные в квадратные скобки:
[..]
. Закрывающие квадратные скобки можно включить в токен, если они экранированы обратной косой чертой (\
).
Все значения токенов возвращаются как строки. Рекомендуется преобразовывать значения в нужные типы, используя соответствующие функции. |
Спецификация функции
parse_tokens(value: <строка>) :: <массив>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для токенизации. |
да |
Ошибки
Функция parse_tokens
возвращает ошибку, для которой требуется обработка, если value
не является правильно отформатированной строкой с токенами.
Пример
Разбор токенов
parse_tokens(
"A sentence \"with \\\"a\\\" sentence inside\" and [some brackets]"
)
[ "A", "sentence", "with \\\"a\\\" sentence inside", "and", "some brackets" ]
parse_url
Разбирает value
в формате URL.
По умолчанию, если во входном URL указан стандартный порт, он не учитывается. Поле port в возвращаемом объекте остается пустым.
|
Спецификация функции
parse_url(value: <строка>, [default_known_ports: <логическое значение>]) :: <объект>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Текст URL. |
да |
|
|
логическое значение |
Заполнять ли номер порта значением по умолчанию.
Если во входном URL не указан номер порта или он совпадает со стандартным, поле будет заполнено значением по умолчанию. Это применимо к протоколам |
|
нет |
Ошибки
Функция parse_url
возвращает ошибку, для которой требуется обработка, если value
не является правильно отформатированным URL.
Примеры
Разбор URL
parse_url!("ftp://foo:bar@example.com:4343/foobar?hello=world#123")
{
"scheme": "ftp",
"username": "foo",
"password": "bar",
"host": "example.com",
"port": 4343,
"path": "/foobar",
"query": {
"hello": "world"
},
"fragment": "123"
}
Разбор URL с портом по умолчанию
parse_url!("https://example.com", default_known_ports: true)
{
"scheme": "https",
"username": "",
"password": "",
"host": "example.com",
"port": 443,
"path": "/",
"query": {},
"fragment": null
}
parse_user_agent
Разбирает value
как строку пользовательского агента. Формат пользовательского агента имеет нечеткое определение, поэтому функция обеспечивает лишь максимально возможные результаты, а не точный разбор.
|
Спецификация функции
parse_user_agent(value: <строка>, [mode: <строка>]) :: <объект>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для разбора. |
да |
|
|
строка |
Определяет характеристики производительности и надежности:
|
|
нет |
Примеры
Быстрый режим
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"
)
{
"browser": {
"family": "Firefox",
"version": "1.0.1"
},
"device": {
"category": "pc"
},
"os": {
"family": "Linux",
"version": null
}
}
Надежный режим
parse_user_agent(
"Mozilla/4.0 (compatible; MSIE 7.66; Windows NT 5.1; SV1; .NET CLR 1.1.4322)",
mode: "reliable"
)
{
"browser": {
"family": "Internet Explorer",
"version": "7.66"
},
"device": {
"category": "pc"
},
"os": {
"family": "Windows XP",
"version": "NT 5.1"
}
}
Расширенный режим
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"
)
{
"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: <строка>) :: <целое число>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
IP-адрес для преобразования в бинарный формат. |
да |
Ошибки
Функция ip_aton
возвращает ошибку, для которой требуется обработка, если value
не является допустимым IPv4-адресом.
Пример
IPv4 в целое число
ip_aton!("233.252.0.4")
3925606404
ip_cidr_contains
Определяет, содержится ли ip
в блоке, заданном с помощью cidr
.
Спецификация функции
ip_cidr_contains(cidr: <строка | массив>, ip: <строка>) :: <логическое значение>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка массив |
Маска CIDR (v4 или v6). |
да |
|
|
строка |
IP-адрес (v4 или v6). |
да |
Ошибки
Функция ip_cidr_contains
может возвращать ошибки, для которых требуется обработка:
-
cidr
не является допустимой маской CIDR. -
ip
не является допустимым IP-адресом.
Примеры
IPv4 содержит CIDR
ip_cidr_contains!("203.0.113.0/24", "203.0.113.32")
true
IPv4 является частным
ip_cidr_contains!(["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"], "192.168.10.32")
true
ip_cidr_contains!("2001:db8:4:ba::/64", "2001:db8:4:ba:2e0:81ff:fe22:d1f1")
true
ip_ntoa
Преобразует числовое представление IPv4-адреса в байтах, представленных в сетевом порядке, в представление чисел и точек.
Функция повторяет поведение функции inet_ntoa.
Спецификация функции
ip_ntoa(value: <строка>) :: <строка>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Целочисленное представление IPv4-адреса. |
да |
Ошибки
Функция ip_ntoa
возвращает ошибку, для которой требуется обработка, если value
не может быть представлено в u32.
Пример
Целое число в IPv4
ip_ntoa!(3925606404)
233.252.0.4
ip_ntop
Преобразует IPv4 и IPv6-адреса из бинарной формы в текстовую форму.
Функция повторяет поведение функции inet_ntop.
Двоичные данные для этой функции не всегда легко отобразить в печатном виде. Однако результаты функций, таких как decode_base64 или decode_percent , все равно можно использовать корректно.
|
Спецификация функции
ip_ntop(value: <строка>) :: <строка>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Двоичные данные для преобразования. Для IPv4-адресов длина должна быть 4 байта (32 бита). Для IPv6-адресов длина должна быть 16 байт (128 бит). |
да |
Ошибки
Функция ip_ntop
возвращает ошибку, для которой требуется обработка, если value
должно быть длиной 4 или 16 байт
Примеры
Преобразование IPv4-адреса из байтов после декодирования из Base64
ip_ntop!(decode_base64!("wKgAAQ=="))
192.168.0.1
Преобразование IPv6-адреса из байтов после декодирования из Base64
ip_ntop!(decode_base64!("IAENuIWjAAAAAIouA3BzNA=="))
2001:db8:85a3::8a2e:370:7334
ip_pton
Преобразует IPv4 и IPv6-адреса из текстовой формы в бинарную форму.
-
Бинарная форма IPv4-адресов имеет длину 4 байта (32 бита).
-
Бинарная форма IPv6-адресов имеет длину 16 байт (128 бит).
Функция повторяет поведение функции inet_pton.
Двоичные данные из этой функции не всегда могут быть удобочитаемыми. Однако результаты функций, таких как encode_base64 или encode_percent , все равно можно корректно обрабатывать.
|
Спецификация функции
ip_pton(value: <строка>) :: <строка>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
IP-адрес (v4 или v6) для преобразования в бинарную форму. |
да |
Ошибки
Функция ip_pton
возвращает ошибку, для которой требуется обработка, если value
не является допустимым IP-адресом (v4 или v6) в текстовой форме.
Примеры
Преобразование IPv4-адреса в байты и кодирование в Base64
encode_base64(ip_pton!("192.168.0.1"))
wKgAAQ==
Преобразование IPv6-адреса в байты и кодирование в Base64
encode_base64(ip_pton!("2001:db8:85a3::8a2e:370:7334"))
IAENuIWjAAAAAIouA3BzNA==
ip_subnet
Извлекает подсетевой адрес из ip
с использованием заданной подсети (subnet
).
Функция работает как с IPv4-, так и с IPv6 адресами. Версия IP для маски должна быть такой же, как у предоставленного адреса. |
Спецификация функции
ip_subnet(ip: <строка>, subnet: <строка>) :: <строка>, <ошибка>
Аргумент | Тип | Описание | Обязателен |
---|---|---|---|
|
строка |
IP-адрес (v4 или v6). |
да |
|
строка |
Подсеть, которую необходимо извлечь из IP-адреса в одном из представлений:
|
да |
Ошибки
Функция ip_subnet
может возвращать ошибки, для которых требуется обработка:
-
ip
не является допустимым IP-адресом. -
subnet
не является допустимой подсетью.
Примеры
Подсеть IPv4
ip_subnet!("192.168.10.32", "255.255.255.0")
192.168.10.0
Подсеть IPv6
ip_subnet!("2404:6800:4003:c02::64", "/32")
2404:6800::
ip_to_ipv6
Преобразует ip
в адрес IPv6.
Спецификация функции
ip_to_ipv6(ip: <строка>) :: <строка>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
IP-адрес, который необходимо преобразовать в IPv6. |
да |
Ошибки
Функция ip_to_ipv6
возвращает ошибку, для которой требуется обработка, если ip
не является допустимым IP-адресом.
Пример
IPv4 в IPv6
ip_to_ipv6!("192.168.10.32")
::ffff:192.168.10.32
ipv6_to_ipv4
Преобразует ip
в адрес IPv4. Если ip
уже является IPv4-адресом, то он возвращается без изменений. Если ip
является IPv6-адресом, то он должен быть совместим с IPv4, в противном случае возникнет ошибка.
Спецификация функции
ipv6_to_ipv4(ip: <строка>) :: <строка>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
IPv4-совместимый IPv6-адрес для преобразования. |
да |
Ошибки
Функция ipv6_to_ipv4
может возвращать ошибки, для которых требуется обработка:
-
ip
не является допустимым IP-адресом. -
ip
является IPv6-адресом, который не совместим с IPv4.
Пример
IPv6 в IPv4
ipv6_to_ipv4!("::ffff:192.168.0.1")
192.168.0.1
rv_ipv6_to_ipv4
Преобразует value
из адреса IPv6 в адрес IPv4. Если value
уже является IPv4-адресом или выполнить преобразование из IPv6 невозможно, возвращается значение без изменений. Если value
не является IP-адресом, функция возвращает пустую строку.
Спецификация функции
rv_ipv6_to_ipv4(value: <строка>)
:: <строка>
Аргумент | Тип | Описание | Обязателен |
---|---|---|---|
|
строка |
IPv6-адрес для преобразования в IPv4. |
да |
Примеры
Адрес IPv4, отображенный в IPv6
rv_ipv6_to_ipv4!("::ffff:192.168.0.1")
"192.168.0.1"
Адрес IPv6, совместимый с IPv4
rv_ipv6_to_ipv4!("0:0:0:0:0:ffff:c633:6410")
"198.51.100.16"
Адрес IPv6, несовместимый с IPv4
rv_ipv6_to_ipv4!("2001:0db8:85a3::8a2e:0370:7334")
"2001:0db8:85a3::8a2e:0370:7334"
Адрес IPv4
rv_ipv6_to_ipv4!("198.51.100.16")
"198.51.100.16"
Невалидный адрес IP
rv_ipv6_to_ipv4!("i am not an ipaddress")
""