в моем случае я использую последнюю версию aws-for-fluent-bit V2.15.0, потому что я хочу сохранить журналы приложений в cloudwatch, и этот образ подготовлен для этого.
Я не использовал фильтр Kubernetes, потому что он добавляет много вещей, которые я могу видеть прямо в кластере, мне просто нужны журналы приложений в cloudwatch для разработчиков. Поэтому я использую этот Amazon предоставляет yaml в качестве основы, используя только хвост INPUT для журналов контейнера и container_firstline parser.
Как вы увидите, я создаю свой собственный фильтр под названием parser, который берет журналы и выполняет регулярное выражение. Мои журналы необычны, потому что в некоторых случаях мы используем встроенный JSON, поэтому в конце у меня есть 2 типа журналов, один только с текстом, а другой с JSON внутри, например 2:
2021-06-09 15:01:26: a5c35b84: block-bridge-5cdc7bc966-cq44r: clients::63 INFO: Message received from topic block.customer.get.info
2021-06-09 15:01:28: a5c35b84: block-bridge-5cdc7bc966-cq44r: block_client::455 INFO: Filters that will be applied (parsed to PascalCase): {"ClientId": 88888, "ServiceNumber": "BBBBBBFA5527", "Status": "AC"}
Эти 2 типа журналов заставляют меня создать 2 регулярных выражения типа PARSER и 1 настраиваемый ФИЛЬТР, называемый парсером. Фильтр сопоставляет эти 2 типа журналов с помощью парсеров (parser_logs и parser_json).
Основная проблема заключалась в том, что часть JSON не была правильно проанализирована, всегда получайте часть JSON с обратной косой чертой (\), чтобы избежать двойных кавычек () следующим образом:
2021-06-09 15:01:28: a5c35b84: block-bridge-5cdc7bc966-cq44r: block_client::455 INFO: Filters that will be applied (parsed to PascalCase): {\"ClientId\": 88888, \"ServiceNumber\": \"BBBBBBFA5527\", \"Status\": "AC"}
Решением было добавить Decode_Field_As, который, по мнению многих, не требуется. В моем случае мне нужно удалить обратную косую черту (). Вы увидите, что я использую только поле additional_message, где я точно совпадаю с JSON.
Наконец, вот моя конфигурация:
.
.
[INPUT]
Name tail
Tag kube.*
Exclude_Path /var/log/containers/cloudwatch-agent*, /var/log/containers/fluent-bit*, /var/log/containers/aws-node*, /var/log/containers/kube-proxy*
Path /var/log/containers/*.log
Docker_Mode On
Docker_Mode_Flush 5
Docker_Mode_Parser container_firstline
Parser docker
DB /var/fluent-bit/state/flb_kube.db
Mem_Buf_Limit 10MB
Skip_Long_Lines Off
Refresh_Interval 10
[FILTER]
Name parser
Match kube.*
Key_Name log
Parser parser_json
Parser parser_logs
.
.
.
[PARSER]
Name parser_logs
Format regex
Regex ^(?<time_stamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}): (?<environment>.*?): (?<hostname>.*?): (?<module>.*?)::(?<line>\d+) (?<log_level>[A-Z]+): (?<message>[a-zA-Z0-9 _.,:()'"!¡]*)$
Time_Key time
Time_Format %d/%b/%Y:%H:%M:%S %z
[PARSER]
Name parser_json
Format regex
Regex ^(?<time_stamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}): (?<environment>.*?): (?<hostname>.*?): (?<module>.*?)::(?<line>\d+) (?<log_level>[A-Z]+): (?<message>[^{]*)(?<message_additional>{.*)$
Time_Key time
Time_Format %d/%b/%Y:%H:%M:%S %z
Decode_Field_As escaped_utf8 message_additional do_next
Decode_Field_As escaped message_additional do_next
Decode_Field_As json message_additional
[PARSER]
Name container_firstline
Format regex
Regex (?<log>(?<="log":")\S(?!\.).*?)(?<!\\)".*(?<stream>(?<="stream":").*?)".*(?<time>\d{4}-\d{1,2}-\d{1,2}T\d{2}:\d{2}:\d{2}\.\w*).*(?=})
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%LZ
[PARSER]
Name docker
Format json
Time_Key @timestamp
Time_Format %Y-%m-%dT%H:%M:%S.%L
Time_Keep Off
Следует иметь в виду, что Decode_Field_As необходимо, чтобы декодируемое поле было полностью в формате JSON (начиная с {и заканчивая}). Если в нем есть текст, а затем JSON, декодирование не удастся. Вот почему мне нужно создать 2 регулярных выражения PARSER .. чтобы точно соответствовать JSON в некоторых журналах внутри одного уникального поля с именем message_additional.
Вот мои новые проанализированные журналы в cloudwatch:
{
"environment": "a5c35b84",
"hostname": "block-bridge-5cdc7bc966-qfptx",
"line": "753",
"log_level": "INFO",
"message": "Message received from topic block.customer.get.info",
"module": "block_client",
"time_stamp": "2021-06-15 10:24:38"
}
{
"environment": "a5c35b84",
"hostname": "block-bridge-5cdc7bc966-m5sln",
"line": "64",
"log_level": "INFO",
"message": "Getting ticket(s) using params ",
"message_additional": {
"ClientId": 88888,
"ServiceNumber": "BBBBBBFA5527",
"Status": "AC"
},
"module": "block_client",
"time_stamp": "2021-06-15 10:26:04"
}
person
Angel Costales
schedule
15.06.2021