如何让fluentd/elasticsearch从kubernetes吊舱将“log”key_名称解析为json?
我在k8s集群中尝试从fluentd获取elasticsearch日志时遇到问题 我有几个web应用程序,它们将日志输出为json。使用docker容器的本地简单设置,我可以灵活地正确读取和解析日志。以下是kibana中显示的本地json示例:如何让fluentd/elasticsearch从kubernetes吊舱将“log”key_名称解析为json?,json,elasticsearch,logging,kubernetes,fluentd,Json,elasticsearch,Logging,Kubernetes,Fluentd,我在k8s集群中尝试从fluentd获取elasticsearch日志时遇到问题 我有几个web应用程序,它们将日志输出为json。使用docker容器的本地简单设置,我可以灵活地正确读取和解析日志。以下是kibana中显示的本地json示例: { "_index": "logstash-2020.01.17", "_type": "fluentd", "_id": "S620sm8B2LEvFR841ylg", "_version": 1, "_score": null,
{
"_index": "logstash-2020.01.17",
"_type": "fluentd",
"_id": "S620sm8B2LEvFR841ylg",
"_version": 1,
"_score": null,
"_source": {
"log": {
"@timestamp": "2020-01-17T08:53:03.066290",
"caller": "StaticFileHelper.py::get",
"data": {
"python.thread": "Thread-1[{record.thread}]",
"python.lineno": 45,
"python.filename": "StaticFileHelper.py",
"python.logger_name": "root",
"python.module": "StaticFileHelper",
"python.funcName": "get",
"python.pid": 11239
},
"message": "application/javascript",
"level": "INFO"
},
"@timestamp": "2020-01-17T08:53:03.000000000+00:00"
},
"fields": {
"@timestamp": [
"2020-01-17T08:53:03.000Z"
],
"log.@timestamp": [
"2020-01-17T08:53:03.066Z"
]
},
"sort": [
1579251183000
]
}
在索引模式下,我可以看到正确的映射。当我在日志输出中引入新字段时,映射会更新。此处的输出示例:
log.@timestamp: date
log.caller: string
log.caller.keyword: string
log.data.python.filename: string
log.data.python.filename.keyword: string
log.data.python.funcName :string
在群集中,未正确分析日志字段:
{
"_index": "logstash-2020.01.17",
"_type": "fluentd",
"_id": "atUDs28BFgXM_nqQvYUY",
"_version": 1,
"_score": null,
"_source": {
"log": "{'@timestamp': '2020-01-17T10:19:21.775339', 'caller': 'RequestLoggingManager.py::print_request_id', 'data': {'python.thread': 'MainThread[{record.thread}]', 'python.lineno': 28, 'python.filename': 'RequestLoggingManager.py', 'python.logger_name': 'root', 'python.module': 'RequestLoggingManager', 'python.funcName': 'print_request_id', 'request_id': '1579256361-1494-XYyVj', 'python.pid': 8}, 'message': 'request: \"1579256361-1497-JUeYF\" is about to enter \"get_settings\"', 'level': 'INFO'}\n",
"stream": "stderr",
"docker": {
"container_id": "fc5b0d5b0aa4008961b18dfe93c4e04b2cfbde0f7ff072dc702c55823baba3a4"
},
"kubernetes": {
"container_name": "cms",
"namespace_name": "default",
"pod_name": "cms-68c4b49657-b88hs",
"container_image": "HIDDEN",
"container_image_id": "HIDDEN",
"pod_id": "ffc6a681-390b-11ea-bcac-42010a8000be",
"labels": {
"app": "cms",
"pod-template-hash": "68c4b49657",
"version": "1.0.0"
},
"host": "HIDDEN",
"master_url": "https://10.0.0.1:443/api",
"namespace_id": "1ede7315-14fa-11ea-95c1-42010a80010f"
},
"@timestamp": "2020-01-17T10:19:21.776876369+00:00",
"tag": "kubernetes.var.log.containers.cms-68c4b49657-b88hs_default_cms-fc5b0d5b0aa4008961b18dfe93c4e04b2cfbde0f7ff072dc702c55823baba3a4.log"
},
"fields": {
"@timestamp": [
"2020-01-17T10:19:21.776Z"
]
},
"highlight": {
"kubernetes.labels.app": [
"@kibana-highlighted-field@cms@/kibana-highlighted-field@"
]
},
"sort": [
1579256361776
]
}
映射如下所示:
log: string
log.keyword: string
无法识别任何自定义json映射
是否有办法自定义此日志字段?如果有,我需要在哪里进行更改?我是fluentd和elastic的新手,因此任何帮助都将不胜感激
我正在kubernetes上使用fluent/fluentd kubernetes守护程序。为了解决这个问题,我在docker中本地拉并运行了fluent/fluentd kubernetes守护程序:v1.4.2-debian-elasticsearch-1.1图像。当entrypoint.sh试图替换containers FLUENT.conf文件中的信息时,我必须确保在初始运行时将FLUENT_ELASTICSEARCH_USER和FLUENT_ELASTICSEARCH_PASSWORD指定为env变量。如果不指定密码,则会清除文件中的信息 然后,执行到正在运行的容器中,并将以下信息添加到fluent.conf中:
filter **>
@type record_transformer
<record>
log_json ${record["log"]}
</record>
</filter>
<filter **>
@type parser
@log_level debug
key_name log_json
reserve_data true
remove_key_name_field true
emit_invalid_record_to_error false
<parse>
@type json
</parse>
</filter>
在此之后,我退出并停止了容器,将容器提交到Docker Hub上我自己的repo中的全新映像,并在DaeomnSet yaml文件中引用了新映像,我们使用该文件部署到k8s
这可能不是最灵巧或最有效的方法,但在没有任何关于如何定制fluentd.conf的文档的情况下,这就解决了问题。为了解决这个问题,我在docker中本地拉并运行了fluent/fluentd kubernetes守护程序:v1.4.2-debian-elasticsearch-1.1图像。当entrypoint.sh试图替换containers FLUENT.conf文件中的信息时,我必须确保在初始运行时将FLUENT_ELASTICSEARCH_USER和FLUENT_ELASTICSEARCH_PASSWORD指定为env变量。如果不指定密码,则会清除文件中的信息 然后,执行到正在运行的容器中,并将以下信息添加到fluent.conf中:
filter **>
@type record_transformer
<record>
log_json ${record["log"]}
</record>
</filter>
<filter **>
@type parser
@log_level debug
key_name log_json
reserve_data true
remove_key_name_field true
emit_invalid_record_to_error false
<parse>
@type json
</parse>
</filter>
在此之后,我退出并停止了容器,将容器提交到Docker Hub上我自己的repo中的全新映像,并在DaeomnSet yaml文件中引用了新映像,我们使用该文件部署到k8s
这可能不是最灵巧或最有效的方法,但在没有任何关于如何定制fluentd.conf的文档的情况下,这就成功了。这非常有效,非常感谢。注意:您不必使用额外的log_json字段。我只使用了第二个过滤器,并将key_name更改为直接指向日志字段。如果删除它,唯一的区别是原始日志在转换后丢失。然而,调试这个完整配置是完美的。这就像一个魅力,非常感谢你。注意:您不必使用额外的log_json字段。我只使用了第二个过滤器,并将key_name更改为直接指向日志字段。如果删除它,唯一的区别是原始日志在转换后丢失。但是,对于调试来说,这个完整配置是完美的。