ключ журнала не анализируется fluent-bit (оба контейнера Docker)

Мой парсер регулярных выражений, похоже, не работает. Я предполагаю, что это как-то связано с журналами, поступающими из Docker, а не с экранированием. Но я не могу заставить его работать, даже если сначала включу парсер Docker.

Я проверил это в рубрике: https://rubular.com/r/l6LayuI7MQWIUL

fluent-bit.conf

[SERVICE]
    Flush        5
    Daemon       Off
    Log_Level    debug
    Parsers_File parsers.conf

[INPUT]
    Name         forward
    Listen       0.0.0.0
    Port         24224

[FILTER]
    Name         grep
    Match        *
    Regex        log ^.*{.*}$

[FILTER]
    Name         parser
    Match        *
    Key_Name     log
    Parser       springboot

[OUTPUT]
    Name stdout
    Match *

parsers.conf

[PARSER]
    Name        springboot
    Format      regex
    Regex       (?<time>\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}.\d{1,3}) (?<level>[^ ]*) (?<number>\d*) --- (?<thread>\[[^ ]*) (?<logger>[^ ]*) *: (?<message>[^ ].*)$
    Time_Key    time
    Time_Format %Y-%m-%d %H:%M:%S.%L

[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    log

крепкий продукт

[0] docker-container: [1584997354.000000000, {"log"=>"2020-03-23 21:02:34.077 TRACE 1 --- [nio-8080-exec-1] org.zalando.logbook.Logbook              : {...}", "container_id"=>"5a1251dcf9de3f0e2b8b7b0bce1d35d9c9285726b477606b6448c7ce9e818511", "container_name"=>"/xxxx", "source"=>"stdout"}]

Спасибо


person Quinten Scheppermans    schedule 23.03.2020    source источник


Ответы (2)


  • Убедитесь, что вы используете последнюю версию Fluent Bit (v1.3.11).
  • Удалите запись Decode_Field_As из вашего parsers.conf, больше не требуется.
person edsiper    schedule 24.03.2020
comment
Я обновился с 1.3 до 1.3.11 и удалил Decode_Field_As, как это было отредактировано в моем исходном сообщении. Ничего не изменилось. Есть другие предложения? - person Quinten Scheppermans; 24.03.2020
comment
@QuintenScheppermans вам удалось заставить его работать? - person Tatenda Zifudzi; 18.07.2021

в моем случае я использую последнюю версию 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