我正在尝试从记录中查找一个键,并将其用作流畅位中的logstash前缀。但这并没有发生,即使指定的键存在于来自kubernetes过滤器的丰富日志中,Logstash_Prefix也不会被Logstash_Prefix_Key替换。
kubernetes filter的理想行为是通过input插件使用kubernetes数据(如pod名称、pod id、命名空间名称等)来丰富从输入路径读取的日志,并通过es输出插件将应用过滤器后的日志推送到输出源。我使用Logstash_Prefix_Key获取密钥kubernetes.pod_name,并将Logstash_Prefix作为pod_name。尽管我可以在Kibana中看到kubernetes.pod_name密钥,但日志存储在前缀pod_name中(这意味着在日志记录中找不到Logstash_Prefix_Key,所以它使用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堆栈的新手,有人能帮我解决这个问题吗
发布于 2020-09-21 17:26:21
更新:现在支持了!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
更新:现在支持了!https://github.com/fluent/fluent-bit/issues/421#issuecomment-766912018应该在Fluent Bit v1.7版本中!
发布于 2021-02-04 09:58:28
我最近也在尝试做同样的事情,虽然Max Lobur上面所说的fluentbit在1.7版本之前没有对此提供支持,但这是真的。但是,我仍然能够使用nest过滤器在当前版本中实现这一点,请参阅https://docs.fluentbit.io/manual/pipeline/outputs/elasticsearch .under the Logstash_Prefix_Key it
包含
时:将查找属于该键的记录中的值,并覆盖Logstash_Prefix以生成索引。如果在记录中找不到键/值,则Logstash_Prefix选项将充当后备选项。不支持嵌套键(如果需要,可以使用嵌套筛选器插件删除嵌套)
最后一句话是关于不支持的嵌套键,但是如果您使用嵌套过滤器将它们提升到一个级别,您仍然可以使用它们。
在您的例子中,pod_name嵌套在kubernetes下,为了仍然能够使用它,您必须将其提升到该级别之外。参见nest example here。
下面是如何让它在你的案例中工作:
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。然后将kubernetes_pod_name传递给Logstash_prefix_key。然后,kubernetes_pod_name的值将用于索引生成,且仅当kubernetes_pod_name不存在键/值对时才返回到logstash_prefix
发布于 2021-05-15 00:12:01
您可以使用:
Logstash_Prefix_Key kubernetes['pod_name']这可以在我的机器上使用docker镜像:fluent/fluent-bit:1.7
https://stackoverflow.com/questions/63988955
复制相似问题