3

我正在尝试从记录中查找密钥并将其用作流利位中的 logstash 前缀。但即使指定的键存在于过滤器的丰富日志中,这也不会发生并且Logstash_Prefix不会被替换。Logstash_Prefix_Keykubernetes

Kubernetes 过滤器的理想行为是input使用 Kubernetes 数据(例如 pod 名称、pod id、命名空间名称等)丰富通过插件从输入路径读取的日志。当应用过滤器后的日志通过es输出插件推送到输出源时。我曾经Logstash_Prefix_Key拿到钥匙kubernetes.pod_name并给了Logstash_Prefixas pod_name。即使我能够kubernetes.pod_name在 Kibana 中看到密钥,日志也会存储在前缀中pod_name(这意味着Logstash_Prefix_Key找不到 tn 日志记录,因此它使用Logstash_Prefix)。

代码示例

input-kubernetes.conf: |
    [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/*.log
        Parser            docker
        DB                /var/log/flb_kube.db
        Mem_Buf_Limit     2GB
        Skip_Long_Lines   On
        Refresh_Interval  10

  filter-kubernetes.conf: |
    [FILTER]
        Name                kubernetes
        Match               kube.*
        Kube_URL            https://kubernetes.default.svc.cluster.local:443
        Merge_Log           Off
        K8S-Logging.Parser  On

  output-elasticsearch.conf: |
    [OUTPUT]
        Name            es
        Match           kube.*
        Host            ${FLUENT_ELASTICSEARCH_HOST}
        Port            ${FLUENT_ELASTICSEARCH_PORT}
        HTTP_User       ${FLUENT_ELASTICSEARCH_USER}
        HTTP_Passwd     ${FLUENT_ELASTICSEARCH_PASSWORD}
        Logstash_Format On
        Logstash_Prefix pod_name
        Logstash_Prefix_Key kubernetes.pod_name
        Retry_Limit     False

由于我是 EFK 堆栈的新手,有人可以帮我解决这个问题吗

4

3 回答 3

2

UPD:现在支持!https://github.com/fluent/fluent-bit/issues/421#issuecomment-766912018 应该在 Fluent Bit v1.7 版本中!


FluentBit 目前不支持动态 ElasticSearch 索引。这是一个相关的问题:https ://github.com/fluent/fluent-bit/issues/421 。您只能指定字符串(硬编码)前缀。

解决方法是改用 fluentd 日志收集器,它支持动态索引:https ://docs.fluentd.org/output/elasticsearch#index_name-optional 。有一个社区图表:https ://github.com/helm/charts/tree/master/stable/fluentd

UPD:现在支持!https://github.com/fluent/fluent-bit/issues/421#issuecomment-766912018 应该在 Fluent Bit v1.7 版本中!

于 2020-09-21T09:26:21.453 回答
1

最近正在尝试做同样的事情,尽管 Max Lobur 上面所说的关于 fluentbit 在尚未发布的 1.7 版之前没有对此的支持是正确的。但是,我仍然能够使用nest过滤器在当前版本中实现这一点,请参阅https://docs.fluentbit.io/manual/pipeline/outputs/elasticsearchLogstash_Prefix_Key它说

包含时:将查找记录中属于该键的值并覆盖 Logstash_Prefix 以生成索引。如果在记录中找不到键/值,则 Logstash_Prefix 选项将作为后备选项。不支持嵌套键(如果需要,可以使用嵌套过滤器插件去除嵌套)

最后一句话是关于不支持嵌套键的,但是如果您使用嵌套过滤器将它们提升一个级别,您仍然可以使用它们。

在您的情况下, pod_name 嵌套在 kubernetes 下,要仍然能够使用它,您必须将其提升到该级别之外。在此处查看嵌套示例

以下是如何使其适用于您的情况:

filter-kubernetes.conf: |
[FILTER]
    Name                kubernetes
    Match               kube.*
    Kube_URL            https://kubernetes.default.svc.cluster.local:443
    Merge_Log           Off
    K8S-Logging.Parser  On

[FILTER]
    Name                nest
    Match               *
    Operation           lift
    Nested_under        kubernetes
    Add_prefix          kubernetes_

output-elasticsearch.conf: |
[OUTPUT]
    Name            es
    Match           kube.*
    Host            ${FLUENT_ELASTICSEARCH_HOST}
    Port            ${FLUENT_ELASTICSEARCH_PORT}
    HTTP_User       ${FLUENT_ELASTICSEARCH_USER}
    HTTP_Passwd     ${FLUENT_ELASTICSEARCH_PASSWORD}
    Logstash_Format On
    Logstash_Prefix pod_name
    Logstash_Prefix_Key kubernetes_pod_name
    Retry_Limit     False

我们在这里所做的是将 kubernetes 对象中的所有内容提升到一个级别,并在它们前面加上 kubernetes_,所以你的pod_name将变为kubernetes_pod_name. 然后,您将 to 传递kubernetes_pod_nameLogstash_prefix_key. 的值kubernetes_pod_name然后用于索引生成,并且只有logstash_prefix在不存在键/值对的情况下才会使用kubernetes_pod_name

于 2021-02-04T01:58:28.433 回答
0

您可以使用:

Logstash_Prefix_Key kubernetes['pod_name']

这正在使用 docker 映像在我的机器上运行:fluent/fluent-bit:1.7

于 2021-05-14T16:12:01.380 回答