Конфигурация Fluentd для анализа в зависимости от исходного модуля - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть конфигурация Fluentd, которая берет журналы из определенного пространства имен K8s (app-ns) и использует мультипарсер для анализа вывода как JSON или игнорирует какой-либо специальный анализ. В настоящее время это выглядит следующим образом:

    <system>
      log_level info
    </system>

    <match kubernetes.**>
      @type rewrite_tag_filter
      <rule>
        key $['kubernetes']['namespace_name']
        pattern ^(.+)$
        tag $1.${tag}
      </rule>
    </match>


    <filter app-ns.**>
        @type parser
        format multi_format
        time_parse false
        suppress_parse_error_log true
        ignore_key_not_exist true
        key_name log
        reserve_data true
        hash_value_field app_log
        <parse>
            @type multi_format
            <pattern>
                format json
            </pattern>
            <pattern>
                format none
            </pattern>
        </parse>
    </filter>

    <filters for other namespaces>


    <match kubernetes.** kubelet.** docker.** kube-proxy.** kube-apiserver.** kube-controller-manager.** kube-scheduler.** default.** kube-system.** ap-ns.** <other namespaces> >
      @type kinesis_streams
      @id out_kinesis_streams
      <configs for kinesis>
    </match>

    <match **>
       @type null
    </match>

В этом пространстве имен есть службы, использующие протоколирование JSON, которые вызывают конфликт в полях нашего стека ELK, что приводит к удалению журналов. Я надеюсь добиться того, чтобы одно развертывание было разрешено анализировать как JSON, но мои попытки не сработали.

Я думал примерно так:

    <match app-ns.**>
    @type rewrite_tag_filter
      <rule>
        key $['kubernetes']['container_name']
        pattern <regex for container to match on>
        tag app-ns-json
      </rule>
    </match>

    <filter app-ns-json.**>
        @type parser
        format multi_format
        time_parse false
        suppress_parse_error_log true
        ignore_key_not_exist true
        key_name log
        reserve_data true
        hash_value_field app_log
        <parse>
            @type multi_format
            <pattern>
                format json
            </pattern>
            <pattern>
                format none
            </pattern>
        </parse>
    </filter>

Но я не могу заставить его работать. Когда я попробовал это, нет журналов дошло до нашего стека ELK.

Любые предложения будут оценены!

1 Ответ

0 голосов
/ 08 апреля 2020

Разобрался, просто нужно было все правила в одном блоке match:

    <match app-ns.**>
    @type rewrite_tag_filter
      <rule>
        key $['kubernetes']['container_name']
        pattern <regex for container to match on>
        tag app-ns.json.${tag}
      </rule>
      <rule>
        key $['kubernetes']['namespace_name']
        pattern ^(.+)$
        tag $1.${tag}
      </rule>
    </match>

    <filter app-ns.json.**>
        @type parser
        format multi_format
        time_parse false
        suppress_parse_error_log true
        ignore_key_not_exist true
        key_name log
        reserve_data true
        hash_value_field app_log
        <parse>
            @type multi_format
            <pattern>
                format json
            </pattern>
            <pattern>
                format none
            </pattern>
        </parse>
    </filter>
...