我如何让 fluentd / elasticsearch 将 "log" key_name 解析为来自 kubernetes pod 的 json?
How do I get fluentd / elasticsearch to parse the "log" key_name as json from a kubernetes pod?
我在尝试从 k8s 集群中的 fluentd 获取日志到 elasticsearch 时遇到问题。
我有几个 Web 应用程序将它们的日志输出为 json。在本地使用带有 docker 容器的简单设置,我可以灵活地正确读取和解析日志。这是 kibana 中显示的本地 json 示例:
{
"_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
在集群中,"log" 字段未被正确解析:
{
"_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
None 的自定义 json 映射被识别。
是否有自定义此 "log" 字段的方法?如果可以,我需要在哪里进行更改?我对流利和弹性很陌生,所以任何帮助将不胜感激!
我在 kubernetes 上使用 fluent/fluentd-kubernetes-daemonset。
为了解决这个问题,我在 docker 中拉取 运行 本地的 fluent/fluentd-kubernetes-daemonset:v1.4.2-debian-elasticsearch-1.1 镜像。必须确保我在初始 运行 上指定 FLUENT_ELASTICSEARCH_USER 和 FLUENT_ELASTICSEARCH_PASSWORD 作为环境变量,因为 entrypoint.sh 试图替换容器 fluent.conf 文件中的信息。如果您不指定密码,它会清除文件中的信息。
然后就是在运行ning容器中执行,并在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 中的 b运行d 新图像,并引用了我们在 DaeomnSet yaml 文件中的新图像正在使用最多部署 k8s。
这可能不是最灵活或最有效的方法,但在没有任何关于如何自定义 fluentd.conf 的文档的情况下,这暂时可以解决问题。
我在尝试从 k8s 集群中的 fluentd 获取日志到 elasticsearch 时遇到问题。
我有几个 Web 应用程序将它们的日志输出为 json。在本地使用带有 docker 容器的简单设置,我可以灵活地正确读取和解析日志。这是 kibana 中显示的本地 json 示例:
{
"_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
在集群中,"log" 字段未被正确解析:
{
"_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
None 的自定义 json 映射被识别。
是否有自定义此 "log" 字段的方法?如果可以,我需要在哪里进行更改?我对流利和弹性很陌生,所以任何帮助将不胜感激!
我在 kubernetes 上使用 fluent/fluentd-kubernetes-daemonset。
为了解决这个问题,我在 docker 中拉取 运行 本地的 fluent/fluentd-kubernetes-daemonset:v1.4.2-debian-elasticsearch-1.1 镜像。必须确保我在初始 运行 上指定 FLUENT_ELASTICSEARCH_USER 和 FLUENT_ELASTICSEARCH_PASSWORD 作为环境变量,因为 entrypoint.sh 试图替换容器 fluent.conf 文件中的信息。如果您不指定密码,它会清除文件中的信息。
然后就是在运行ning容器中执行,并在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 中的 b运行d 新图像,并引用了我们在 DaeomnSet yaml 文件中的新图像正在使用最多部署 k8s。
这可能不是最灵活或最有效的方法,但在没有任何关于如何自定义 fluentd.conf 的文档的情况下,这暂时可以解决问题。