Fluent-bit - разбиение json log на структурированные поля в Elasticsearch
Я пытаюсь найти способ в конфигурации Fluent-bit, чтобы сказать / принудительно заставить ES хранить простые журналы в формате json (приведенный ниже бит, поступающий из docker stdout / stderror) в структурированном виде - пожалуйста, смотрите изображение внизу для лучшего объяснения. Например, помимо (или вместе с) хранения журнала в виде простой записи JSON под log
поле, я хотел бы хранить каждое свойство индивидуально, как показано красным.
Документация для фильтров и анализаторов очень скудна и неясна. Кроме того, forward
вход не имеет опции парсера. Я пытался json/docker/regex
парсеры но не везет. Мое регулярное выражение здесь, если я должен использовать регулярное выражение. В настоящее время используется ES (7.1), Fluent-bit (1.1.3) и Kibana (7.1) - не Kubernetes.
Если кто-нибудь может привести меня к примеру или привести один, я был бы очень признателен.
Спасибо
{
"_index": "hello",
"_type": "logs",
"_id": "T631e2sBChSKEuJw-HO4",
"_version": 1,
"_score": null,
"_source": {
"@timestamp": "2019-06-21T21:34:02.000Z",
"tag": "php",
"container_id": "53154cf4d4e8d7ecf31bdb6bc4a25fdf2f37156edc6b859ba0ddfa9c0ab1715b",
"container_name": "/hello_php_1",
"source": "stderr",
"log": "{\"time_local\":\"2019-06-21T21:34:02+0000\",\"client_ip\":\"-\",\"remote_addr\":\"192.168.192.3\",\"remote_user\":\"\",\"request\":\"GET / HTTP/1.1\",\"status\":\"200\",\"body_bytes_sent\":\"0\",\"request_time\":\"0.001\",\"http_referrer\":\"-\",\"http_user_agent\":\"curl/7.38.0\",\"request_id\":\"91835d61520d289952b7e9b8f658e64f\"}"
},
"fields": {
"@timestamp": [
"2019-06-21T21:34:02.000Z"
]
},
"sort": [
1561152842000
]
}
Спасибо
конф
[SERVICE]
Flush 5
Daemon Off
Log_Level debug
Parsers_File parsers.conf
[INPUT]
Name forward
Listen 0.0.0.0
Port 24224
[OUTPUT]
Name es
Match hello_*
Host elasticsearch
Port 9200
Index hello
Type logs
Include_Tag_Key On
Tag_Key tag
3 ответа
Решение следующее.
[SERVICE]
Flush 5
Daemon Off
Log_Level debug
Parsers_File parsers.conf
[INPUT]
Name forward
storage.type filesystem
Listen my_fluent_bit_service
Port 24224
[FILTER]
Name parser
Parser docker
Match hello_*
Key_Name log
Reserve_Data On
Preserve_Key On
[OUTPUT]
Name es
Host my_elasticsearch_service
Port 9200
Match hello_*
Index hello
Type logs
Include_Tag_Key On
Tag_Key tag
[PARSER]
Name docker
Format json
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%L
Time_Keep On
# Command | Decoder | Field | Optional Action
# =============|==================|=================
Decode_Field_As escaped_utf8 log do_next
Decode_Field_As json log
Ответ на более общий случай использования Firelens сaws-for-fluent-bit
изображение, где сообщение оказывается ключом верхнего уровняlog
как здесь:
{
"log": "{\"time_local\":\"2019-06-21T21:34:02+0000\",\"client_ip\":\"-\",\"remote_addr\":\"192.168.192.3\",\"remote_user\":\"\",\"request\":\"GET / HTTP/1.1\",\"status\":\"200\",\"body_bytes_sent\":\"0\",\"request_time\":\"0.001\",\"http_referrer\":\"-\",\"http_user_agent\":\"curl/7.38.0\",\"request_id\":\"91835d61520d289952b7e9b8f658e64f\"}"
}
Следуя этому официальному примеру AWS , обратите внимание, что в изображении уже существует парсер JSON , который можно использовать следующим образом:
"firelensConfiguration": {
"type": "fluentbit",
"options": {
"config-file-type": "file",
"config-file-value": "/fluent-bit/configs/parse-json.conf"
}
}
ИЛИ его можно вызвать с помощью переменной среды:
"environment": [
{
"name": "aws_fluent_bit_init_file_1",
"value": "/fluent-bit/configs/parse-json.conf"
}
]
Результат:
{
"time_local": "2019-06-21T21:34:02+0000",
"client_ip": "-",
"remote_addr": "192.168.192.3",
"remote_user": "",
"request": "GET / HTTP/1.1",
"status": "200",
"body_bytes_sent": "0",
"request_time": "0.001",
"http_referrer": "-",
"http_user_agent": "curl/7.38.0",
"request_id": "91835d61520d289952b7e9b8f658e64f"
}
Для этой цели вы можете использовать фильтр Fluent Bit Nest, см. Следующую документацию: