{"id":469493,"date":"2025-08-04T15:00:36","date_gmt":"2025-08-04T15:00:36","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=469493"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=469493","title":{"rendered":"<span>VRL \u2014 \u043f\u0440\u043e\u0441\u0442\u043e, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>Vector \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0433\u0438\u0431\u043a\u0438\u043c \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 &#8212; VRL.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0441\u043b\u043e\u0432 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044e \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c VRL, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043f\u043e\u043b\u0435 \u0438\u0437 JSON \u0444\u0430\u0439\u043b\u0430<\/p>\n<p>\u041d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code>{   \"field1\": \"foo\",   \"field2\": \"bar\" } <\/code><\/pre>\n<p>\u041d\u0430\u0448\u0430 \u043f\u0435\u0440\u0432\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043d\u0430 VRL \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code>sources:   file_input:     type: file     include:       - \/opt\/habr\/vector\/intro.json     ignore_checkpoints: true  transforms:   parse_file:     type: remap     inputs:       - file_input     source: |          .message = parse_json!(.message)         .field1 = .message.field1          del(.host)         del(.file)         del(.message)         del(.timestamp)         del(.source_type)  sinks:   test_output:     type: file     inputs:       - parse_file     path: \/opt\/habr\/vector\/intro_out.json     encoding:       codec: json <\/code><\/pre>\n<p>\u0418 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code>{   \"field1\": \"foo\" } <\/code><\/pre>\n<p>\u0417\u0430\u0447\u0435\u043c \u0432 \u043d\u0430\u0448\u0435\u043c \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435 \u0442\u0430\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u043b\u0435\u0439?<\/p>\n<pre><code>        del(.host)         del(.file)         del(.message)         del(.timestamp)         del(.source_type) <\/code><\/pre>\n<p>\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 &#8212; file, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0435\u0449\u0451 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0438.<br \/> \u0412\u043e\u0442 \u043a\u0430\u043a \u0431\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043d\u0430\u0448 \u0432\u044b\u0432\u043e\u0434, \u0435\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u043e\u043b\u044f:<\/p>\n<pre><code>{   \"field1\": \"foo\",   \"file\": \"\/opt\/habr\/vector\/intro.json\",   \"host\": \"test-mon\",   \"message\": {     \"field1\": \"foo\",     \"field2\": \"bar\"   },   \"source_type\": \"file\",   \"timestamp\": \"2025-03-17T13:09:20.653470883Z\" } <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043d\u0430\u0448\u0435 \u043f\u043e\u043b\u0435 field1 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0430\u0436\u0434\u044b. \u041f\u0440\u0430\u0432\u0434\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212; \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u0435\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430, \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212; \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u044c message, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439 \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 VRL \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u0434 VRL. \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 VRL \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439, \u043d\u043e \u0431\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u043e\u0434\u0438\u043d VRL \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 100, 200 \u0438 300 \u0441\u0442\u0440\u043e\u043a. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0451 \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e, \u0435\u0441\u0442\u044c \u0440\u0438\u0441\u043a \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u044b\u043d\u0435\u0441\u0442\u0438 VRL \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 &#171;file&#187; \u0432 transform<\/p>\n<pre><code>sources:   file_input:     type: file     include:       - \/opt\/habr\/vector\/intro.json     ignore_checkpoints: true  transforms:   parse_file:     type: remap     inputs:       - file_input     file: \/etc\/vector\/habr\/intro.vrl  sinks:   test_output:     type: file     inputs:       - parse_file     path: \/opt\/habr\/vector\/intro_out.json     encoding:       codec: json <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435, \u0430 \u0441 \u0441\u0430\u043c\u0438\u043c VRL \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435.<\/p>\n<h3>2. \u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 VRL<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0437\u0443\u0447\u0438\u0432 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 VRL, \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Vector \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e.<\/p>\n<h3>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/h3>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 VRL \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435, \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e:<\/p>\n<pre><code>$ a=5                                                                 5  $ b = \"some text\" \"some text\"  $ pi = 3.14 3.14  $ k = true true <\/code><\/pre>\n<p>\u041b\u0438\u0431\u043e \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code>$ c = snakecase(b) \"some_text\" <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code>$ a = 5 + 5 10  $ a = 5 - 2 3  $ a = 5 * 5 25  $ a = 5 \/ 5 1  $ a = 7 \/ 5 1.4  $ a = mod(5, 3) 2 <\/code><\/pre>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<pre><code>$ str1 = \"some text\" \"some text\"  $ str2 = \"other text\" \"other text\"  $ str1 + \" and \" + str2 \"some text and other text\" <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441 \u0442\u043e\u0447\u043a\u0438 &#8212; \u044d\u0442\u043e JSON \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0439\u0434\u0443\u0442 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432 sink, \u0430 \u0431\u0435\u0437 \u043d\u0435\u0451 &#8212; \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430.<\/p>\n<h3>\u041c\u0430\u0441\u0441\u0438\u0432\u044b<\/h3>\n<p>VRL \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438. \u041c\u0430\u0441\u0441\u0438\u0432\u044b \u043c\u043e\u0433\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 \u043b\u044e\u0431\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0447\u0438\u0441\u043b\u0430, \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 JSON \u043e\u0431\u044a\u0435\u043a\u0442\u044b:<\/p>\n<pre><code>$ a = 5 5  $ arr = [\"text\", 5, 3.14, true, a, {\"foo\": \"bar\"}] [\"text\", 5, 3.14, true, 5, { \"foo\": \"bar\" }] <\/code><\/pre>\n<h3>\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438 \u0446\u0438\u043a\u043b\u044b<\/h3>\n<p>\u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e VRL \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 if, \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0446\u0438\u043a\u043b\u043e\u0432 \u043f\u043e \u0442\u0438\u043f\u0443 for \u0438\u043b\u0438 while \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442, \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 \u043d\u0430\u043c \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0443 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 for \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0445\u043e\u0436\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435. \u0410 \u0432\u043e\u0442 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0446\u0438\u043a\u043b while, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043b\u0438\u0448\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u043d\u0443\u0436\u0434:<\/p>\n<pre><code>$ while  error[E205]: reserved keyword   \u250c\u2500 :1:1   \u2502 1 \u2502 while   \u2502 ^^^^^   \u2502 \u2502   \u2502 this identifier name is reserved for future use in the language   \u2502 use a different name instead   \u2502   = see language documentation at https:\/\/vrl.dev   = try your code in the VRL REPL, learn more at https:\/\/vrl.dev\/examples <\/code><\/pre>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c, \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 &#8212; <a href=\"https:\/\/vector.dev\/docs\/reference\/vrl\/expressions\/#keywords\" rel=\"noopener noreferrer nofollow\">https:\/\/vector.dev\/docs\/reference\/vrl\/expressions\/#keywords<\/a><\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0447\u043d\u0451\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f if &#8212; else.<br \/> \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0432\u043f\u043e\u043b\u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441:<\/p>\n<pre><code>if *\u0443\u0441\u043b\u043e\u0432\u0438\u0435* { *\u0434\u0435\u0439\u0441\u0442\u0438\u0432\u0435* } else if *\u0443\u0441\u043b\u043e\u0432\u0438\u0435* { *\u0434\u0435\u0439\u0442\u0441\u0432\u0438\u0435* } else { *\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435* } <\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u044d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435:<\/p>\n<pre><code>$ a = 3 if (a == 10) {   \"first block\" } else if (a &lt;= 10) {   \"second block\" } else {   \"third block\" } \"second block\" <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432. \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b, \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 VRL \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0446\u0438\u043a\u043b for \u0438 \u0435\u0441\u0442\u044c \u043b\u0438\u0448\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0445\u043e\u0436\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>for_each<\/code>. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0442\u0430\u043a\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432:<\/p>\n<pre><code>.arr = [\"my\", \"first\", \"array\", \"loop\"] <\/code><\/pre>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>upcase<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>for_each<\/code>:<\/p>\n<pre><code>$ .new_arr = [] $ $ for_each(.arr) -&gt; |_index, value|{     .new_arr = push(.new_arr, upcase(value)) } $ $ .new_arr [\"MY\", \"FIRST\", \"ARRAY\", \"LOOP\"] $ .arr = del(.new_arr) [\"MY\", \"FIRST\", \"ARRAY\", \"LOOP\"] <\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 <code>.arr<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>for_each<\/code>. \u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>|_index, value|<\/code>, \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043d\u0430\u0441 \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 <code>.new_arr<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>push<\/code>. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043d\u0430\u0448\u0435\u043c\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439.<\/p>\n<p>\u0423 \u0432\u0430\u0441 \u043c\u043e\u0433 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441, \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>upscale<\/code> \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443? \u041d\u043e, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, VRL \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>$ for_each(.arr) -&gt; |index, value| {     .arr[index] = upcase(value) }  error[E203]: syntax error   \u250c\u2500 :2:10   \u2502 2 \u2502     .arr[index] = upcase(value)   \u2502          ^^^^^   \u2502          \u2502   \u2502          unexpected syntax token: \"Identifier\"   \u2502          expected one of: \"integer literal\"   \u2502   = see language documentation at https:\/\/vrl.dev   = try your code in the VRL REPL, learn more at https:\/\/vrl.dev\/examples <\/code><\/pre>\n<p>\u041d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u043d\u0430\u0447\u0435, \u043d\u0435 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u044f \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>map_value<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code>$ map_values(.arr) -&gt; |value| { upcase!(value) } [\"MY\", \"FIRST\", \"ARRAY\", \"LOOP\"] <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043d\u043e \u043d\u0430 \u044d\u0442\u043e \u0440\u0430\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0451\u0442\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>.arr<\/code>:<\/p>\n<pre><code>$ .new_arr = [] $ $ for_each(.arr) -&gt; |index, value| {     if mod(index, 2) == 0 {         .new_arr = push(.new_arr, upcase(value))     } else{         .new_arr = push(.new_arr, value)     } } $ $ .new_arr [\"MY\", \"first\", \"ARRAY\", \"loop\"] $ .arr = del(.new_arr) [\"MY\", \"first\", \"ARRAY\", \"loop\"] <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u043d\u043e\u0432\u044c \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u0430\u0448 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041d\u0430 \u044d\u0442\u043e \u0440\u0430\u0437 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c <code>index<\/code> \u0431\u0435\u0437 \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u0432 \u0442\u0435\u043b\u0435 <code>for_each<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430. \u0415\u0441\u043b\u0438 \u0435\u0433\u043e \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 2 \u0440\u0430\u0432\u0435\u043d 0, \u0442\u043e\u0433\u0434\u0430 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>.arr<\/code> \u0447\u0451\u0442\u043d\u044b\u0439 \u0438 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043a \u043d\u0435\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>upscale<\/code>. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>.arr<\/code> \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432\u0443 <code>.new_arr<\/code> \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043d\u0430 \u0431\u043b\u043e\u043a <code>else<\/code>. \u0415\u0433\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0430\u0448 \u0446\u0438\u043a\u043b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u043d\u0435\u0447\u0451\u0442\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0431\u0440\u043e\u0448\u0435\u043d\u044b:<\/p>\n<pre><code>$ .new_arr [\"MY\", ARRAY\"] <\/code><\/pre>\n<h3>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/h3>\n<p>\u041d\u0435\u043c\u0430\u043b\u043e \u0432\u0430\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430. \u041f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0442\u044c \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u0442\u0430\u043a\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<pre><code>1,,3 <\/code><\/pre>\n<p>\u0418 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438 \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 5, \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0432 \u0438\u0445 \u0437\u0430\u043f\u044f\u0442\u043e\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0430\u043a\u043e\u0439 VRL:<\/p>\n<pre><code>arr = split(.message, \",\")  .var1 = to_int(arr[0]) * 5 .var2 = to_int(arr[1]) * 5 .var3 = to_int(arr[2]) * 5 <\/code><\/pre>\n<p>\u0410 \u0441\u0430\u043c \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code>sources:   file_input:     type: file     include:       - \/opt\/habr\/vector\/error.txt     ignore_checkpoints: true  transforms:   parse_file:     type: remap     inputs:       - file_input     file: \/etc\/vector\/habr\/errors.vrl  sinks:   test_output:     type: file     inputs:       - parse_file     path: \/opt\/habr\/vector\/error.json     encoding:       codec: json <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c vector \u0441 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439:<\/p>\n<pre><code>root@test-mon:\/etc\/vector\/habr# vector --config errors.yaml  2025-07-16T14:30:36.222710Z  INFO vector::app: Log level is enabled. level=\"info\" 2025-07-16T14:30:36.223878Z  INFO vector::app: Loading configs. paths=[\"errors.yaml\"] 2025-07-16T14:30:36.226896Z ERROR vector::topology::builder: Configuration error. error=Transform \"parse_file\":  error[E103]: unhandled fallible assignment   \u250c\u2500 :1:7   \u2502 1 \u2502 arr = split(.message, \",\")   \u2502 ----- ^^^^^^^^^^^^^^^^^^^^   \u2502 \u2502     \u2502   \u2502 \u2502     this expression is fallible because at least one argument's type cannot be verified to be valid   \u2502 \u2502     update the expression to be infallible by adding a `!`: `split!(.message, \",\")`   \u2502 \u2502     `.message` argument type is `any` and this function expected a parameter `value` of type `string` <\/code><\/pre>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e vector \u0441\u0440\u0430\u0437\u0443 \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>split<\/code>, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0430\u043a\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043e\u0448\u0438\u0431\u043a\u0430\u043c. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u0432 \u043d\u0430\u0448\u0435\u043c \u0432\u044b\u0431\u043e\u0440\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>split<\/code> \u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u00ab!\u00bb, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u043a\u0442\u043e\u0440 \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0430\u0441\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043b \u0440\u0430\u0431\u043e\u0442\u0443:<\/p>\n<pre><code>arr = split!(.message, \",\") <\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c vector:<\/p>\n<pre><code>root@test-mon:\/etc\/vector\/habr# vector --config errors.yaml  2025-07-16T14:35:09.037986Z  INFO vector::app: Log level is enabled. level=\"info\" 2025-07-16T14:35:09.039181Z  INFO vector::app: Loading configs. paths=[\"errors.yaml\"] 2025-07-16T14:35:09.042971Z ERROR vector::topology::builder: Configuration error. error=Transform \"parse_file\":  error[E103]: unhandled fallible assignment   \u250c\u2500 :3:9   \u2502 3 \u2502 .var1 = to_int(arr[0]) * 5   \u2502 ------- ^^^^^^^^^^^^^^^^^^ this expression is fallible because at least one argument's type cannot be verified to be valid <\/code><\/pre>\n<p>\u0418 \u0432\u043d\u043e\u0432\u044c \u043d\u0435\u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u0432\u043d\u043e\u0432\u044c vector \u043f\u0430\u0434\u0430\u0435\u0442 \u0438\u0437-\u0437\u0430 \u043e\u0448\u0438\u0431\u043a\u0438. \u041d\u0430 \u044d\u0442\u043e \u0440\u0430\u0437 \u0435\u043c\u0443 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>to_int<\/code>.<br \/> \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u043e\u0447\u0435\u043d\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0432 \u0441\u0435\u0431\u0435 \u043b\u044e\u0434\u0438, \u0438 \u0442\u0430\u043a \u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u00ab!\u00bb \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<pre><code>.var1 = to_int!(arr[0]) * 5 .var2 = to_int!(arr[1]) * 5 .var3 = to_int!(arr[2]) * 5 <\/code><\/pre>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u0438 vector \u043d\u0435 \u0441\u0432\u0430\u043b\u0438\u0442\u0441\u044f \u0432 \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<pre><code>root@test-mon:\/etc\/vector\/habr# vector --config errors.yaml  2025-07-16T14:36:22.005848Z  INFO vector::app: Log level is enabled. level=\"info\" 2025-07-16T14:36:22.006867Z  INFO vector::app: Loading configs. paths=[\"errors.yaml\"] 2025-07-16T14:36:22.010056Z  INFO vector::topology::running: Running healthchecks. 2025-07-16T14:36:22.010141Z  INFO vector::topology::builder: Healthcheck passed. 2025-07-16T14:36:22.010142Z  INFO vector: Vector has started. debug=\"false\" version=\"0.45.0\" arch=\"x86_64\" revision=\"063cabb 2025-02-24 14:52:02.810034614\" 2025-07-16T14:36:22.010167Z  INFO vector::app: API is disabled, enable by setting `api.enabled` to `true` and use commands like `vector top`. 2025-07-16T14:36:22.010197Z  INFO source{component_kind=\"source\" component_id=file_input component_type=file}: vector::sources::file: Starting file server. include=[\"\/opt\/habr\/vector\/error.txt\"] exclude=[] 2025-07-16T14:36:22.010491Z  INFO source{component_kind=\"source\" component_id=file_input component_type=file}:file_server: file_source::checkpointer: Loaded checkpoint data. 2025-07-16T14:36:22.010623Z  INFO source{component_kind=\"source\" component_id=file_input component_type=file}:file_server: vector::internal_events::file::source: Found new file to watch. file=\/opt\/habr\/vector\/error.txt 2025-07-16T14:36:22.010881Z ERROR transform{component_kind=\"transform\" component_id=parse_file component_type=remap}: vector::internal_events::remap: Mapping failed with event. error=\"function call error for \\\"to_int\\\" at (65:80): Invalid integer \\\"\\\": cannot parse integer from empty string\" error_type=\"conversion_failed\" stage=\"processing\" internal_log_rate_limit=true <\/code><\/pre>\n<p>\u0412\u0440\u043e\u0434\u0435 \u0431\u044b \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e, \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 vector \u043d\u0435 \u0443\u043f\u0430\u043b. \u041d\u043e \u0432 \u043b\u043e\u0433\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0434\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435:<\/p>\n<pre><code>2025-07-16T14:36:22.010881Z ERROR transform{component_kind=\"transform\" component_id=parse_file component_type=remap}: vector::internal_events::remap: Mapping failed with event. error=\"function call error for \\\"to_int\\\" at (65:80): Invalid integer \\\"\\\": cannot parse integer from empty string\" error_type=\"conversion_failed\" stage=\"processing\" internal_log_rate_limit=true <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438, \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043d\u0430 \u0432\u0445\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>to_int<\/code> \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b\u043e \u043f\u0443\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e. \u0427\u0442\u043e \u0436\u0435 \u0442\u043e\u0433\u0434\u0430 vector \u0437\u0430\u043f\u0438\u0441\u0430\u043b \u0432 \u0444\u0430\u0439\u043b \u0432\u044b\u0432\u043e\u0434\u0430?<\/p>\n<pre><code>{\"file\":\"\/opt\/habr\/vector\/error.txt\",\"host\":\"test-mon\",\"message\":\"1,,3\",\"source_type\":\"file\",\"timestamp\":\"2025-07-16T14:36:22.010766422Z\"} <\/code><\/pre>\n<p>\u0410 \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0443 \u043d\u0430\u0441 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e\u0441\u044c \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u0447\u0451\u0442\u043b\u0438\u0432\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0437\u043b\u043e\u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c \u0437\u043d\u0430\u043a\u0430\u043c\u0438 \u00ab!\u00bb, \u0430 \u043d\u0443\u0436\u043d\u043e \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0432\u0430\u0448\u0430 \u0444\u043e\u0440\u043c\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.<\/p>\n<p>\u041d\u043e \u043a\u0430\u043a \u0436\u0435 \u043d\u0430\u043c \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438? \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0437\u0430\u0447\u0435\u043c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>to_int<\/code>. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>split<\/code>, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 arr \u0432 string. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u043d\u0430 5, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a int. \u0418 \u0432 \u043d\u0430\u0448\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043d\u0430\u0434\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c:<\/p>\n<pre><code>.var1, err = to_int(arr[0]) * 5 .var2, err = to_int(arr[1]) * 5 .var3, err = to_int(arr[2]) * 5 <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435:<\/p>\n<pre><code>{\"file\":\"\/opt\/habr\/vector\/error.txt\",\"host\":\"test-mon\",\"message\":\"1,,3\",\"source_type\":\"file\",\"timestamp\":\"2025-07-16T17:29:05.314777030Z\",\"var1\":5,\"var2\":0,\"var3\":15} <\/code><\/pre>\n<p>\u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438\u0441\u044c \u043d\u0430\u0448\u0438 \u043f\u043e\u043b\u044f, \u0430 \u043f\u043e\u043b\u0435 \u0441 \u043f\u0443\u0441\u0442\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438\u0440\u0430\u0432\u043d\u044f\u043b\u043e\u0441\u044c \u0443 \u043d\u0443\u043b\u044e. \u0412\u0441\u0451 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <code>arr[1]<\/code> \u0443 \u043d\u0430\u0441 null \u0438 \u043f\u0440\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 `to_int, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c 0<\/p>\n<h3>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c VRL \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435.<br \/> \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u043a\u0435\u0439\u0441, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438. \u0418 \u044d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438.<\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u043f\u043e\u043b\u0435\u0439:<\/p>\n<pre><code>\"account_receiver\": \"234567891012\", \"account_sender\": \"750\", \"auth_channel_end\": \"PS\", \"auth_channel_start\": \"PS\", \"auth_context_end\": \"PS,43604000B000DA02,2025-02-14T10:10:28+03:00\", \"auth_context_start\": \"PS,43604000B000DA02,2025-02-14T10:10:28+03:00\", \"authorization_time\": \"2025-01-21 08:10:35\", \"branch_code\": \"123456789101\", \"channel_type\": \"3\", \"compliance_rules\": \"345678912101,91,[],[],,AC\", \"counterparty_id_a\": \"\", \"counterparty_id_b\": \"urn:86661307-056805-0\", \"customer_external_id\": \"436046005035947\", \"customer_id\": \"234567891012\", \"customer_internal_id\": \"\", \"device_type\": \"1\", \"entry_time_end\": \"2025-02-14 10:10:28\", \"entry_time_start\": \"2025-02-14 10:10:28\", \"entrypoint_node_end\": \"43604000B000DA02\", \"entrypoint_node_start\": \"43604000B000DA02\", \"forwarding\": \"\", \"forwarding_reason\": \"\", \"operation_code\": \"234567891012\", \"processing_code\": \"900\", \"processing_time_sec\": \"55\", \"security_flag\": \"\", \"session_token_a\": \"jrccpjjjqhkcj2ar2k0srqrqa20qanc2@1.2.3.4\", \"session_token_b\": \"678F728F12B9D00030BA8@2.3.4.5:1234\", \"session_token_c\": \"\", \"status_http\": \"\", \"transaction_end_time\": \"2025-02-14 10:11:17\", \"transaction_id\": \"51ab65e0-0805-498f-8508-3cc4cd459ffd\", \"transaction_start_time\": \"2025-01-21 08:10:22\", \"transaction_status_code\": \"16\", \"transaction_type\": \"522\", \"used_services_raw\": \"OIP,override,0,,,2025-02-14T10:10:23+03:00,,,,[];CAT,,0,,,2025-02-14T10:10:31+03:00,,,,[]\", \"user_interaction_time_sec\": \"43\" <\/code><\/pre>\n<p>\u0418 \u0441\u0430\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0441\u044b\u0440\u043e\u043c \u0432\u0438\u0434\u0435, \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code>2025-02-14T10:11:17+03:00;522;123456789101;51ab65e0-0805-498f-8508-3cc4cd459ffd;234567891012;2025-01-21T10:10:22+05:00;2025-01-21T10:10:35+05:00;234567891012;750;234567  891012;;;3;1;jrccpjjjqhkcj2ar2k0srqrqa20qanc2@1.2.3.4;678F728F12B9D00030BA8@2.3.4.5:1234;;;436046005035947;;urn:86661307-056805-0;PS,43604000B000DA02,2025-02-14T10:10:2  8+03:00;PS,43604000B000DA02,2025-02-14T10:10:28+03:00;\"\";900;\"345678912101,91,[],[],,AC\";\"OIP,override,0,,,2025-02-14T10:10:23+03:00,,,,[];CAT,,0,,,2025-02-14T10:10:31+  03:00,,,,[]\";16;;55;43; <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0435\u0431\u0435 \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443: \u043d\u0430\u0448\u0430 \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0430\u043a\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u0430 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u0443 \u043d\u0430\u0434\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442. \u041d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u043c\u0435\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u0437 RFC 3339 \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 DateTime \u0444\u043e\u0440\u043c\u0430\u0442, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0438 \u0432 compliance_rules \u0438 used_services_raw \u0441 \u00ab;\u00bb \u043d\u0430 \u00ab&amp;\u00bb<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0439 VRL. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u00ab;\u00bb \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0442\u043e \u043c\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438:<\/p>\n<pre><code>.message = string!(.message) .message = parse_regex!(.message, r'^(?P&lt;log_part1&gt;.*?);\"(?P&lt;log_security_flag&gt;)\";(?P&lt;log_processing_code&gt;[^;]*);\"(?P&lt;log_compliance_rules&gt;[^\"]*)\";\"(?P&lt;log_used_service s_raw&gt;[^\"]*)\";(?P&lt;log_part2&gt;.*)$') .part1 = .message.log_part1 .security_flag = .message.log_security_flag .processing_code = .message.log_processing_code .compliance_rules = .message.log_compliance_rules .used_services_raw = .message.log_used_services_raw .part2 = .message.log_part2 <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0443\u0436\u0435 \u0432\u044b\u0447\u043b\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f:<\/p>\n<pre><code>.part1 = string(.part1) arr = split(.part1, \";\") .transaction_end_time, err = if arr[0] != \"\" {     unix_timestamp = to_unix_timestamp(parse_timestamp!(arr[0], \"%+\"))     unix_timestamp = to_int(unix_timestamp) + 10800     format_timestamp(from_unix_timestamp!(unix_timestamp), \"%Y-%m-%d %H:%M:%S\") } else {     \"\" } .transaction_type = to_string(arr[1]) .branch_code = to_string(arr[2]) .transaction_id = to_string(arr[3]) .customer_id = to_string(arr[4]) .transaction_start_time, err = if arr[5] != \"\" {     unix_timestamp = to_unix_timestamp(parse_timestamp!(arr[5], \"%+\"))     unix_timestamp = to_int(unix_timestamp) + 10800     format_timestamp(from_unix_timestamp!(unix_timestamp), \"%Y-%m-%d %H:%M:%S\") } else {     \"\" } .authorization_time, err = if arr[6] != \"\" {     unix_timestamp = to_unix_timestamp(parse_timestamp!(arr[6], \"%+\"))     unix_timestamp = to_int(unix_timestamp) + 10800     format_timestamp(from_unix_timestamp!(unix_timestamp), \"%Y-%m-%d %H:%M:%S\") } else {     \"\" } .operation_code = to_string(arr[7]) .account_sender = to_string(arr[8]) .account_receiver = to_string(arr[9]) .forwarding = to_string(arr[10]) .forwarding_reason = to_string(arr[11]) .channel_type = to_string(arr[12]) .device_type = to_string(arr[13]) .session_token_a = to_string(arr[14]) .session_token_b = to_string(arr[15]) .session_token_c = to_string(arr[16]) .customer_internal_id = to_string(arr[17]) .customer_external_id = to_string(arr[18]) .counterparty_id_a = to_string(arr[19]) .counterparty_id_b = to_string(arr[20]) .auth_context_start = to_string(arr[21]) .auth_context_end = to_string(arr[22]) <\/code><\/pre>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u044d\u0442\u043e \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0435\u0435. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u00ab;\u00bb \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u043e \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 <code>arr<\/code>:<\/p>\n<pre><code>.part1 = string(.part1) arr = split(.part1, \";\") <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u043d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 timestamp <code>transaction_end_time<\/code> \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442.<\/p>\n<pre><code>.transaction_end_time, err = if arr[0] != \"\" {     unix_timestamp = to_unix_timestamp(parse_timestamp!(arr[0], \"%+\"))     unix_timestamp = to_int(unix_timestamp) + 10800     format_timestamp(from_unix_timestamp!(unix_timestamp), \"%Y-%m-%d %H:%M:%S\") } else {     \"\" } <\/code><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>arr<\/code> \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u044b\u043c, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u043d\u0430\u0448\u0443 \u043c\u0435\u0442\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 unix timestamp, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0432 <code>int<\/code> \u0438 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a \u043d\u0435\u043c\u0443 10800 (3 \u0447\u0430\u0441\u0430). \u042d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u0431\u0438\u0442\u044c \u043d\u0430\u0448\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442 \u0442\u0430\u0439\u043c\u0437\u043e\u043d\u044b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f unix timestamp \u0432 GMT +0. \u0418 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u043d\u0430\u0448 unix timestamp \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043c\u0435\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<br \/> \u0410 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f:<\/p>\n<pre><code>.transaction_type = to_string(arr[1]) ... .auth_context_end = to_string(arr[22]) <\/code><\/pre>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043c \u0438 \u0434\u043b\u044f <code>auth_context_start<\/code> \u0438 <code>auth_context_end<\/code><\/p>\n<pre><code>.auth_context_start = string(.auth_context_start) arr1 = split(.auth_context_start, \",\")  .auth_channel_start = to_string(arr1[0]) .entrypoint_node_start = to_string(arr1[1]) .entry_time_start, err = if arr1[2] != \"\" {     unix_timestamp = to_unix_timestamp(parse_timestamp!(arr1[2], \"%+\"))     unix_timestamp = to_int(unix_timestamp) + 10800     format_timestamp(from_unix_timestamp!(unix_timestamp), \"%Y-%m-%d %H:%M:%S\") } else {     \"\" }   .auth_context_end = string(.auth_context_end) arr2 = split(.auth_context_end, \",\")  .auth_channel_end = to_string(arr2[0]) .entrypoint_node_end = to_string(arr2[1]) .entry_time_end, err = if arr2[2] != \"\" {     unix_timestamp = to_unix_timestamp(parse_timestamp!(arr2[2], \"%+\"))     unix_timestamp = to_int(unix_timestamp) + 10800     format_timestamp(from_unix_timestamp!(unix_timestamp), \"%Y-%m-%d %H:%M:%S\") } else {      \"\" } <\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043c \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u0412\u043d\u0443\u0442\u0440\u0438 <code>compliance_rules<\/code> \u043c\u043e\u0436\u0435\u0442 \u0438\u0434\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b, \u043d\u043e \u0432 \u043d\u0430\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0434\u043d\u043e. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u00ab;\u00bb \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 \u043d\u0430 \u00ab&amp;\u00bb:<\/p>\n<pre><code>.compliance_rules = replace(.compliance_rules, \";\", \"&amp;\") <\/code><\/pre>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u044f\u0442\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0439 \u0441\u043a\u043e\u0431\u043e\u043a. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f <code>replace_with<\/code>, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 <code>compliance_rules<\/code> \u0431\u043b\u043e\u043a \u0441 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u043c\u0438 \u0441\u043a\u043e\u0431\u043a\u0430\u043c\u0438 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0437\u0430\u043f\u044f\u0442\u044b\u0435:<\/p>\n<pre><code>.compliance_rules, err = replace_with(.compliance_rules, r'\\[(.*?)\\]') -&gt; |m| {     \"[\" + replace(m.captures[0], \",\", \"&amp;\") + \"]\" } <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>compliance_rules<\/code> \u0438 \u0437\u0430\u0434\u0430\u0451\u043c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0431\u043b\u043e\u043a\u0430 \u0441 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u043c\u0438 \u0441\u043a\u043e\u0431\u043a\u0430\u043c\u0438. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e m \u0438 \u0443\u0436\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0451 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u043f\u044f\u0442\u044b\u0435 \u043d\u0430 \u00ab&amp;\u00bb.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 <code>used_services_raw<\/code>:<\/p>\n<pre><code>.used_services_raw = string(.used_services_raw) .services_info = split(.used_services_raw, \";\") .parsed_services_info = []  for_each(.services_info) -&gt; |_index, value| {     next_service = split(value, \",\")      service_call_time, err = if next_service[5] != \"\" {         unix_timestamp = to_unix_timestamp(parse_timestamp!(next_service[5], \"%+\"))         unix_timestamp = to_int(unix_timestamp) + 10800         format_timestamp(from_unix_timestamp!(unix_timestamp), \"%Y-%m-%d %H:%M:%S\")     } else {         \"\"     }      obj = {         \"service_name\": to_string(next_service[0]),         \"service_mode\": to_string(next_service[1]),         \"number_of_diversions\": to_string(next_service[2]),         \"assoc_party_id\": to_string(next_service[3]),         \"service_id\": to_string(next_service[4]),         \"service_call_time\": service_call_time,         \"number_of_participants\": to_string(next_service[6]),         \"action_type\": to_string(next_service[7]),         \"customer_group_tag\": to_string(next_service[8]),         \"service_cost_info\": to_string(next_service[9])     }      .parsed_services_info = push(.parsed_services_info, obj) } <\/code><\/pre>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 <code>used_services_raw<\/code> \u0443 \u043d\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0438\u0434\u0442\u0438 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u00ab;\u00bb \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 <code>service_info<\/code>.<br \/> \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u0430\u0440\u0441\u0438\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043f\u0440\u043e\u0431\u0435\u0436\u0430\u0432\u0448\u0438\u0441\u044c \u043f\u043e \u043d\u0435\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>for_each<\/code>. \u0412\u043d\u0443\u0442\u0440\u0438 \u043c\u044b \u043f\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u043c\u0435\u043d\u044f\u0435\u043c timestamp, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u043e \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c <code>obj<\/code> \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0438\u0434\u0451\u0442 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441 \u0432\u044b\u0447\u043b\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u0435\u0439 \u0438\u0437 \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f:<\/p>\n<pre><code>.part2 = string(.part2) arr3 = split(.part2, \";\") .transaction_status_code = to_string(arr3[0]) .status_http = to_string(arr3[1]) .processing_time_sec = to_string(arr3[2]) .user_interaction_time_sec = to_string(arr3[3]) <\/code><\/pre>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u043e\u0435\u0434\u0438\u043d\u043e \u0432\u0441\u0435 \u0440\u0430\u0437\u0431\u0438\u0442\u044b\u0435 \u043f\u043e\u043b\u044f \u0432 <code>.message<\/code>, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0444\u0430\u0439\u043b.<\/p>\n<pre><code>.message =      .transaction_end_time + \";\" +         .transaction_type + \";\" +         .branch_code + \";\" +         .transaction_id + \";\" +         .customer_id + \";\" +         .transaction_start_time + \";\" +         .authorization_time + \";\" +         .operation_code + \";\" +         .account_sender + \";\" +         .account_receiver + \";\" +         .forwarding + \";\" +         .forwarding_reason + \";\" +         .channel_type + \";\" +         .device_type + \";\" +         .session_token_a + \";\" +         .session_token_b + \";\" +         .session_token_c + \";\" +         .customer_internal_id + \";\" +         .customer_external_id + \";\" +         .counterparty_id_a + \";\" +         .counterparty_id_b + \";\" +         .auth_channel_start + \",\" +         .entrypoint_node_start + \",\" +         .entry_time_start + \";\" +         .auth_channel_end + \",\" +         .entrypoint_node_end + \",\" +         .entry_time_end + \";\\\"\" +          .security_flag + \"\\\";\" +         .processing_code + \";\\\"\" +         .compliance_rules + \"\\\";\\\"\"  for_each(.parsed_services_info) -&gt; |index, obj| {     if index != 0 {         .message = .message + \"&amp;\"     }     .message = .message +                 obj.service_name + \",\" +                obj.service_mode + \",\" +                obj.number_of_diversions + \",\" +                obj.assoc_party_id + \",\" +                obj.service_id + \",\" +                obj.service_call_time + \",\" +                obj.number_of_participants + \",\" +                obj.action_type + \",\" +                obj.customer_group_tag + \",\" +                obj.service_cost_info         }   .message = .message + \"\\\";\" +                 .transaction_status_code + \";\" +                 .status_http + \";\" +                 .processing_time_sec + \";\" +                 .user_interaction_time_sec + \";\" <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u043e\u043e\u0447\u0435\u0440\u0451\u0434\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043d\u0430\u0448\u0438 \u043f\u043e\u043b\u044f, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043a \u043d\u0438\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0438.<br \/> \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0435\u043a\u0446\u0438\u044e \u0441 <code>parsed_services_info<\/code>. \u041d\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0434\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u043d\u0430 \u00ab&amp;\u00bb. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u043e\u043e\u0447\u0435\u0440\u0451\u0434\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439 \u0432 <code>message<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c \u00ab&amp;\u00bb. \u041d\u043e \u0437\u0434\u0435\u0441\u044c, \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c \u043d\u0435 \u0441\u0442\u0430\u0432\u0438\u043b\u0441\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c \u043d\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u0438\u043d\u0430\u0447\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0442\u043e\u0436\u0435 \u0431\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0441\u044f \u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f, \u0447\u0442\u043e \u043d\u0435\u0432\u0435\u0440\u043d\u043e.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 VRL \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code>.message = string!(.message) .message = parse_regex!(.message, r'^(?P&lt;log_part1&gt;.*?);\"(?P&lt;log_security_flag&gt;)\";(?P&lt;log_processing_code&gt;[^;]*);\"(?P&lt;log_compliance_rules&gt;[^\"]*)\";\"(?P&lt;log_used_services_raw&gt;[^\"]*)\";(?P&lt;log_part2&gt;.*)$') .part1 = .message.log_part1 .security_flag = .message.log_security_flag .processing_code = .message.log_processing_code .compliance_rules = .message.log_compliance_rules .used_services_raw = .message.log_used_services_raw .part2 = .message.log_part2  .part1 = string(.part1) arr = split(.part1, \";\") .transaction_end_time, err = if arr[0] != \"\" {     unix_timestamp = to_unix_timestamp(parse_timestamp!(arr[0], \"%+\"))     unix_timestamp = to_int(unix_timestamp) + 10800     format_timestamp(from_unix_timestamp!(unix_timestamp), \"%Y-%m-%d %H:%M:%S\") } else {     \"\" } .transaction_type = to_string(arr[1]) .branch_code = to_string(arr[2]) .transaction_id = to_string(arr[3]) .customer_id = to_string(arr[4]) .transaction_start_time, err = if arr[5] != \"\" {     unix_timestamp = to_unix_timestamp(parse_timestamp!(arr[5], \"%+\"))     unix_timestamp = to_int(unix_timestamp) + 10800     format_timestamp(from_unix_timestamp!(unix_timestamp), \"%Y-%m-%d %H:%M:%S\") } else {     \"\" } .authorization_time, err = if arr[6] != \"\" {     unix_timestamp = to_unix_timestamp(parse_timestamp!(arr[6], \"%+\"))     unix_timestamp = to_int(unix_timestamp) + 10800     format_timestamp(from_unix_timestamp!(unix_timestamp), \"%Y-%m-%d %H:%M:%S\") } else {     \"\" } .operation_code = to_string(arr[7]) .account_sender = to_string(arr[8]) .account_receiver = to_string(arr[9]) .forwarding = to_string(arr[10]) .forwarding_reason = to_string(arr[11]) .channel_type = to_string(arr[12]) .device_type = to_string(arr[13]) .session_token_a = to_string(arr[14]) .session_token_b = to_string(arr[15]) .session_token_c = to_string(arr[16]) .customer_internal_id = to_string(arr[17]) .customer_external_id = to_string(arr[18]) .counterparty_id_a = to_string(arr[19]) .counterparty_id_b = to_string(arr[20]) .auth_context_start = to_string(arr[21]) .auth_context_end = to_string(arr[22])   .auth_context_start = string(.auth_context_start) arr1 = split(.auth_context_start, \",\")  .auth_channel_start = to_string(arr1[0]) .entrypoint_node_start = to_string(arr1[1]) .entry_time_start, err = if arr1[2] != \"\" {     unix_timestamp = to_unix_timestamp(parse_timestamp!(arr1[2], \"%+\"))     unix_timestamp = to_int(unix_timestamp) + 10800     format_timestamp(from_unix_timestamp!(unix_timestamp), \"%Y-%m-%d %H:%M:%S\") } else {     \"\" }   .auth_context_end = string(.auth_context_end) arr2 = split(.auth_context_end, \",\")  .auth_channel_end = to_string(arr2[0]) .entrypoint_node_end = to_string(arr2[1]) .entry_time_end, err = if arr2[2] != \"\" {     unix_timestamp = to_unix_timestamp(parse_timestamp!(arr2[2], \"%+\"))     unix_timestamp = to_int(unix_timestamp) + 10800     format_timestamp(from_unix_timestamp!(unix_timestamp), \"%Y-%m-%d %H:%M:%S\") } else {      \"\" }   .compliance_rules = replace(.compliance_rules, \";\", \"&amp;\")  .compliance_rules, err = replace_with(.compliance_rules, r'\\[(.*?)\\]') -&gt; |m| {     \"[\" + replace(m.captures[0], \",\", \"&amp;\") + \"]\" }  .used_services_raw = string(.used_services_raw) .services_info = split(.used_services_raw, \";\") .parsed_services_info = []  for_each(.services_info) -&gt; |_index, value| {     next_service = split(value, \",\")              service_call_time, err = if next_service[5] != \"\" {         unix_timestamp = to_unix_timestamp(parse_timestamp!(next_service[5], \"%+\"))         unix_timestamp = to_int(unix_timestamp) + 10800         format_timestamp(from_unix_timestamp!(unix_timestamp), \"%Y-%m-%d %H:%M:%S\")     } else {         \"\"     }                  obj = {         \"service_name\": to_string(next_service[0]),         \"service_mode\": to_string(next_service[1]),         \"number_of_diversions\": to_string(next_service[2]),         \"assoc_party_id\": to_string(next_service[3]),         \"service_id\": to_string(next_service[4]),         \"service_call_time\": service_call_time,         \"number_of_participants\": to_string(next_service[6]),         \"action_type\": to_string(next_service[7]),         \"customer_group_tag\": to_string(next_service[8]),         \"service_cost_info\": to_string(next_service[9])     }                  .parsed_services_info = push(.parsed_services_info, obj) }   .part2 = string(.part2) arr3 = split(.part2, \";\") .transaction_status_code = to_string(arr3[0]) .status_http = to_string(arr3[1]) .processing_time_sec = to_string(arr3[2]) .user_interaction_time_sec = to_string(arr3[3])   .message =      .transaction_end_time + \";\" +         .transaction_type + \";\" +         .branch_code + \";\" +         .transaction_id + \";\" +         .customer_id + \";\" +         .transaction_start_time + \";\" +         .authorization_time + \";\" +         .operation_code + \";\" +         .account_sender + \";\" +         .account_receiver + \";\" +         .forwarding + \";\" +         .forwarding_reason + \";\" +         .channel_type + \";\" +         .device_type + \";\" +         .session_token_a + \";\" +         .session_token_b + \";\" +         .session_token_c + \";\" +         .customer_internal_id + \";\" +         .customer_external_id + \";\" +         .counterparty_id_a + \";\" +         .counterparty_id_b + \";\" +         .auth_channel_start + \",\" +         .entrypoint_node_start + \",\" +         .entry_time_start + \";\" +         .auth_channel_end + \",\" +         .entrypoint_node_end + \",\" +         .entry_time_end + \";\\\"\" +          .security_flag + \"\\\";\" +         .processing_code + \";\\\"\" +         .compliance_rules + \"\\\";\\\"\"  for_each(.parsed_services_info) -&gt; |index, obj| {     if index != 0 {         .message = .message + \"&amp;\"     }     .message = .message +                 obj.service_name + \",\" +                obj.service_mode + \",\" +                obj.number_of_diversions + \",\" +                obj.assoc_party_id + \",\" +                obj.service_id + \",\" +                obj.service_call_time + \",\" +                obj.number_of_participants + \",\" +                obj.action_type + \",\" +                obj.customer_group_tag + \",\" +                obj.service_cost_info         }   .message = .message + \"\\\";\" +                 .transaction_status_code + \";\" +                 .status_http + \";\" +                 .processing_time_sec + \";\" +                 .user_interaction_time_sec + \";\"   del(.host) del(.file) del(.timestamp) del(.source_type) <\/code><\/pre>\n<p>\u0418 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code>2025-02-14 10:11:17;522;123456789101;51ab65e0-0805-498f-8508-3cc4cd459ffd;234567891012;2025-01-21 08:10:22;2025-01-21 08:10:35;234567891012;750;234567891012;;;3;1;jrccpjjjqhkcj2ar2k0srqrqa20qanc2@1.2.3.4;678F728F12B9D00030BA8@2.3.4.5:1234;;;436046005035947;;urn:86661307-056805-0;PS,43604000B000DA02,2025-02-14 10:10:28;PS,43604000B000DA02,2025-02-14 10:10:28;\"\";900;\"345678912101,91,[],[],,AC\";\"OIP,override,0,,,2025-02-14 10:10:23,,,,[]&amp;CAT,,0,,,2025-02-14 10:10:31,,,,[]\";16;;55;43; <\/code><\/pre>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u0430\u043c \u0434\u043e\u043d\u0435\u0441\u0442\u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 VRL. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u041d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u043e\u0441\u0442\u0440\u044f\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0431\u044b\u043b\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0446\u0435\u043f\u0438\u0442\u044c \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b.<br \/> \u0414\u043b\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u044f\u0442\u043d\u0430, \u0435\u0441\u043b\u0438 \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u043e\u0441\u0432\u043e\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043a\u0430\u043a vector \u0438 \u043f\u043e\u043c\u043e\u0436\u0435\u043c \u0432\u0430\u043c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u044b \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0432\u043e\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/933762\/\"> https:\/\/habr.com\/ru\/articles\/933762\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>Vector \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0433\u0438\u0431\u043a\u0438\u043c \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 &#8212; VRL.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0441\u043b\u043e\u0432 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044e \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c VRL, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043f\u043e\u043b\u0435 \u0438\u0437 JSON \u0444\u0430\u0439\u043b\u0430<\/p>\n<p>\u041d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code>{   \"field1\": \"foo\",   \"field2\": \"bar\" } <\/code><\/pre>\n<p>\u041d\u0430\u0448\u0430 \u043f\u0435\u0440\u0432\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043d\u0430 VRL \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code>sources:   file_input:     type: file     include:       - \/opt\/habr\/vector\/intro.json     ignore_checkpoints: true  transforms:   parse_file:     type: remap     inputs:       - file_input     source: |          .message = parse_json!(.message)         .field1 = .message.field1          del(.host)         del(.file)         del(.message)         del(.timestamp)         del(.source_type)  sinks:   test_output:     type: file     inputs:       - parse_file     path: \/opt\/habr\/vector\/intro_out.json     encoding:       codec: json <\/code><\/pre>\n<p>\u0418 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code>{   \"field1\": \"foo\" } <\/code><\/pre>\n<p>\u0417\u0430\u0447\u0435\u043c \u0432 \u043d\u0430\u0448\u0435\u043c \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435 \u0442\u0430\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u043b\u0435\u0439?<\/p>\n<pre><code>        del(.host)         del(.file)         del(.message)         del(.timestamp)         del(.source_type) <\/code><\/pre>\n<p>\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 &#8212; file, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0435\u0449\u0451 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0438.<br \/> \u0412\u043e\u0442 \u043a\u0430\u043a \u0431\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043d\u0430\u0448 \u0432\u044b\u0432\u043e\u0434, \u0435\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u043e\u043b\u044f:<\/p>\n<pre><code>{   \"field1\": \"foo\",   \"file\": \"\/opt\/habr\/vector\/intro.json\",   \"host\": \"test-mon\",   \"message\": {     \"field1\": \"foo\",     \"field2\": \"bar\"   },   \"source_type\": \"file\",   \"timestamp\": \"2025-03-17T13:09:20.653470883Z\" } <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043d\u0430\u0448\u0435 \u043f\u043e\u043b\u0435 field1 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0430\u0436\u0434\u044b. \u041f\u0440\u0430\u0432\u0434\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212; \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u0435\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430, \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212; \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u044c message, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439 \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 VRL \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u0434 VRL. \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 VRL \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439, \u043d\u043e \u0431\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u043e\u0434\u0438\u043d VRL \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 100, 200 \u0438 300 \u0441\u0442\u0440\u043e\u043a. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0451 \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e, \u0435\u0441\u0442\u044c \u0440\u0438\u0441\u043a \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u044b\u043d\u0435\u0441\u0442\u0438 VRL \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 &#171;file&#187; \u0432 transform<\/p>\n<pre><code>sources:   file_input:     type: file     include:       - \/opt\/habr\/vector\/intro.json     ignore_checkpoints: true  transforms:   parse_file:     type: remap     inputs:       - file_input     file: \/etc\/vector\/habr\/intro.vrl  sinks:   test_output:     type: file     inputs:       - parse_file     path: \/opt\/habr\/vector\/intro_out.json     encoding:       codec: json <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435, \u0430 \u0441 \u0441\u0430\u043c\u0438\u043c VRL \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435.<\/p>\n<h3>2. \u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 VRL<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0437\u0443\u0447\u0438\u0432 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 VRL, \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Vector \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e.<\/p>\n<h3>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/h3>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 VRL \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435, \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e:<\/p>\n<pre><code>$ a=5                                                                 5  $ b = \"some text\" \"some text\"  $ pi = 3.14 3.14  $ k = true true <\/code><\/pre>\n<p>\u041b\u0438\u0431\u043e \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code>$ c = snakecase(b) \"some_text\" <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code>$ a = 5 + 5 10  $ a = 5 - 2 3  $ a = 5 * 5 25  $ a = 5 \/ 5 1  $ a = 7 \/ 5 1.4  $ a = mod(5, 3) 2 <\/code><\/pre>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<pre><code>$ str1 = \"some text\" \"some text\"  $ str2 = \"other text\" \"other text\"  $ str1 + \" and \" + str2 \"some text and other text\" <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441 \u0442\u043e\u0447\u043a\u0438 &#8212; \u044d\u0442\u043e JSON \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0439\u0434\u0443\u0442 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432 sink, \u0430 \u0431\u0435\u0437 \u043d\u0435\u0451 &#8212; \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430.<\/p>\n<h3>\u041c\u0430\u0441\u0441\u0438\u0432\u044b<\/h3>\n<p>VRL \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438. \u041c\u0430\u0441\u0441\u0438\u0432\u044b \u043c\u043e\u0433\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 \u043b\u044e\u0431\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0447\u0438\u0441\u043b\u0430, \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 JSON \u043e\u0431\u044a\u0435\u043a\u0442\u044b:<\/p>\n<pre><code>$ a = 5 5  $ arr = [\"text\", 5, 3.14, true, a, {\"foo\": \"bar\"}] [\"text\", 5, 3.14, true, 5, { \"foo\": \"bar\" }] <\/code><\/pre>\n<h3>\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438 \u0446\u0438\u043a\u043b\u044b<\/h3>\n<p>\u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e VRL \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 if, \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0446\u0438\u043a\u043b\u043e\u0432 \u043f\u043e \u0442\u0438\u043f\u0443 for \u0438\u043b\u0438 while \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442, \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 \u043d\u0430\u043c \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0443 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 for \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0445\u043e\u0436\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435. \u0410 \u0432\u043e\u0442 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0446\u0438\u043a\u043b while, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043b\u0438\u0448\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u043d\u0443\u0436\u0434:<\/p>\n<pre><code>$ while  error[E205]: reserved keyword   \u250c\u2500 :1:1   \u2502 1 \u2502 while   \u2502 ^^^^^   \u2502 \u2502   \u2502 this identifier name is reserved for future use in the language   \u2502 use a different name instead   \u2502   = see language documentation at https:\/\/vrl.dev   = try your code in the VRL REPL, learn more at https:\/\/vrl.dev\/examples <\/code><\/pre>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c, \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 &#8212; <a href=\"https:\/\/vector.dev\/docs\/reference\/vrl\/expressions\/#keywords\" rel=\"noopener noreferrer nofollow\">https:\/\/vector.dev\/docs\/reference\/vrl\/expressions\/#keywords<\/a><\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0447\u043d\u0451\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f if &#8212; else.<br \/> \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0432\u043f\u043e\u043b\u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441:<\/p>\n<pre><code>if *\u0443\u0441\u043b\u043e\u0432\u0438\u0435* { *\u0434\u0435\u0439\u0441\u0442\u0438\u0432\u0435* } else if *\u0443\u0441\u043b\u043e\u0432\u0438\u0435* { *\u0434\u0435\u0439\u0442\u0441\u0432\u0438\u0435* } else { *\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435* } <\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u044d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435:<\/p>\n<pre><code>$ a = 3 if (a == 10) {   \"first block\" } else if (a &lt;= 10) {   \"second block\" } else {   \"third block\" } \"second block\" <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432. \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b, \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 VRL \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0446\u0438\u043a\u043b for \u0438 \u0435\u0441\u0442\u044c \u043b\u0438\u0448\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0445\u043e\u0436\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>for_each<\/code>. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0442\u0430\u043a\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432:<\/p>\n<pre><code>.arr = [\"my\", \"first\", \"array\", \"loop\"] <\/code><\/pre>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>upcase<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>for_each<\/code>:<\/p>\n<pre><code>$ .new_arr = [] $ $ for_each(.arr) -&gt; |_index, value|{     .new_arr = push(.new_arr, upcase(value)) } $ $ .new_arr [\"MY\", \"FIRST\", \"ARRAY\", \"LOOP\"] $ .arr = del(.new_arr) [\"MY\", \"FIRST\", \"ARRAY\", \"LOOP\"] <\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 <code>.arr<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>for_each<\/code>. \u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>|_index, value|<\/code>, \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043d\u0430\u0441 \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 <code>.new_arr<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>push<\/code>. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043d\u0430\u0448\u0435\u043c\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439.<\/p>\n<p>\u0423 \u0432\u0430\u0441 \u043c\u043e\u0433 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441, \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>upscale<\/code> \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443? \u041d\u043e, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, VRL \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>$ for_each(.arr) -&gt; |index, value| {     .arr[index] = upcase(value) }  error[E203]: syntax error   \u250c\u2500 :2:10   \u2502 2 \u2502     .arr[index] = upcase(value)   \u2502          ^^^^^   \u2502          \u2502   \u2502          unexpected syntax token: \"Identifier\"   \u2502          expected one of: \"integer literal\"   \u2502   = see language documentation at https:\/\/vrl.dev   = try your code in the VRL REPL, learn more at https:\/\/vrl.dev\/examples <\/code><\/pre>\n<p>\u041d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u043d\u0430\u0447\u0435, \u043d\u0435 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u044f \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>map_value<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code>$ map_values(.arr) -&gt; |value| { upcase!(value) } [\"MY\", \"FIRST\", \"ARRAY\", \"LOOP\"] <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043d\u043e \u043d\u0430 \u044d\u0442\u043e \u0440\u0430\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0451\u0442\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>.arr<\/code>:<\/p>\n<pre><code>$ .new_arr = [] $ $ for_each(.arr) -&gt; |index, value| {     if mod(index, 2) == 0 {         .new_arr = push(.new_arr, upcase(value))     } else{         .new_arr = push(.new_arr, value)     } } $ $ .new_arr [\"MY\", \"first\", \"ARRAY\", \"loop\"] $ .arr = del(.new_arr) [\"MY\", \"first\", \"ARRAY\", \"loop\"] <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u043d\u043e\u0432\u044c \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u0430\u0448 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041d\u0430 \u044d\u0442\u043e \u0440\u0430\u0437 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c <code>index<\/code> \u0431\u0435\u0437 \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u0432 \u0442\u0435\u043b\u0435 <code>for_each<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430. \u0415\u0441\u043b\u0438 \u0435\u0433\u043e \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 2 \u0440\u0430\u0432\u0435\u043d 0, \u0442\u043e\u0433\u0434\u0430 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>.arr<\/code> \u0447\u0451\u0442\u043d\u044b\u0439 \u0438 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043a \u043d\u0435\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>upscale<\/code>. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>.arr<\/code> \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432\u0443 <code>.new_arr<\/code> \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043d\u0430 \u0431\u043b\u043e\u043a <code>else<\/code>. \u0415\u0433\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0430\u0448 \u0446\u0438\u043a\u043b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u043d\u0435\u0447\u0451\u0442\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0431\u0440\u043e\u0448\u0435\u043d\u044b:<\/p>\n<pre><code>$ .new_arr [\"MY\", ARRAY\"] <\/code><\/pre>\n<h3>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/h3>\n<p>\u041d\u0435\u043c\u0430\u043b\u043e \u0432\u0430\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430. \u041f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0442\u044c \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u0442\u0430\u043a\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<pre><code>1,,3 <\/code><\/pre>\n<p>\u0418 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438 \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 5, \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0432 \u0438\u0445 \u0437\u0430\u043f\u044f\u0442\u043e\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0430\u043a\u043e\u0439 VRL:<\/p>\n<pre><code>arr = split(.message, \",\")  .var1 = to_int(arr[0]) * 5 .var2 = to_int(arr[1]) * 5 .var3 = to_int(arr[2]) * 5 <\/code><\/pre>\n<p>\u0410 \u0441\u0430\u043c \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code>sources:   file_input:     type: file     include:       - \/opt\/habr\/vector\/error.txt     ignore_checkpoints: true  transforms:   parse_file:     type: remap     inputs:       - file_input     file: \/etc\/vector\/habr\/errors.vrl  sinks:   test_output:     type: file     inputs:       - parse_file     path: \/opt\/habr\/vector\/error.json     encoding:       codec: json <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c vector \u0441 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439:<\/p>\n<pre><code>root@test-mon:\/etc\/vector\/habr# vector --config errors.yaml  2025-07-16T14:30:36.222710Z  INFO vector::app: Log level is enabled. level=\"info\" 2025-07-16T14:30:36.223878Z  INFO vector::app: Loading configs. paths=[\"errors.yaml\"] 2025-07-16T14:30:36.226896Z ERROR vector::topology::builder: Configuration error. error=Transform \"parse_file\":  error[E103]: unhandled fallible assignment   \u250c\u2500 :1:7   \u2502 1 \u2502 arr = split(.message, \",\")   \u2502 ----- ^^^^^^^^^^^^^^^^^^^^   \u2502 \u2502     \u2502   \u2502 \u2502     this expression is fallible because at least one argument's type cannot be verified to be valid   \u2502 \u2502     update the expression to be infallible by adding a `!`: `split!(.message, \",\")`   \u2502 \u2502     `.message` argument type is `any` and this function expected a parameter `value` of type `string` <\/code><\/pre>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e vector \u0441\u0440\u0430\u0437\u0443 \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>split<\/code>, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0430\u043a\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043e\u0448\u0438\u0431\u043a\u0430\u043c. \u0412 <\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-469493","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/469493","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=469493"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/469493\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=469493"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=469493"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=469493"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}