combined,可以从中解析出请求者信息,报文信息,请求状态等信息,以便于对数据进行进一步分析。66.249.65.159 - - [06/Nov/2014:19:10:38 +0600] "GET /news/53f8d72920ba2744fe873ebc.html HTTP/1.1" 404 177 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
combined 格式采用空格和 - 分隔符来分隔数据,因此按照下文顺序设计解析流程:"分隔符 进行初步数据解析,此时数据处理将会自动将日志转换成 JSON 结构{"0": "66.249.65.159 - - [06/Nov/2014:19:10:38 +0600] ","1": "GET /news/53f8d72920ba2744fe873ebc.html HTTP/1.1","2": " 404 177 ","5": "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"}
0 和 2 的字段由于 - 和空格的影响,还存在连接的耦合数据。因此再分别对这两个键进行 - 和空格进行分隔符拆分。 拆分后的 JSON 结果如下所示:{"1": "GET /news/53f8d72920ba2744fe873ebc.html HTTP/1.1","5": "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)","0.0": "66.249.65.159 ","0.2": " [06/Nov/2014:19:10:38 +0600] ","2.1": "404","2.2": "177"}
[] 方括号,再使用一次分隔符进行截取,截取后的 JSON 如下所示:{"1": "GET /news/53f8d72920ba2744fe873ebc.html HTTP/1.1","5": "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)","0.0": "66.249.65.159 ","0.2": "06/Nov/2014:19:10:38 +0600","2.1": "404","2.2": "177"}
key 设置名称即可。修改后最终结果如下所示:{"request": "GET /news/53f8d72920ba2744fe873ebc.html HTTP/1.1","http_user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)","remote_addr": "66.249.65.159 ","dateTime": "06/Nov/2014:19:10:38 +0600","status": "404","body_bytes_sent ": "177"}
kubernetes 字段中,采集到的日志放入 log 字段中。大致结构如下所示:{"@timestamp": 1648803500.63659,"@filepath": "/var/log/tke-log-agent/test7/c816991f-adfe-4617-8cf3-9997aea90ded/c_tke-es-687995d557-n29jr_default_nginx-add90ccf49626ef42d5615a636aae74d6380996043cf6f6560d8131f21a4d8ba/jgw_INFO_2022-02-10_15_4.log","log": "15:00:00.000[4349811564226374227] [http-nio-8081-exec-64] INFO com.qcloud.jgw.gateway.server.topic.TopicService","kubernetes": {"pod_name": "tke-es-687995d557-n29jr","namespace_name": "default","pod_id": "c816991f-adfe-4617-8cf3-9997aea90ded","labels": {"k8s-app": "tke-es","pod-template-hash": "687995d557","qcloud-app": "tke-es"},"annotations": {"qcloud-redeploy-timestamp": "1648016531476","tke.cloud.tencent.com/networks-status": "[{\\n \\"name\\": \\"tke-bridge\\",\\n \\"interface\\": \\"eth0\\",\\n \\"ips\\": [\\n \\"172.16.0.31\\"\\n ],\\n \\"mac\\": \\"ae:61:12:4a:c2:ba\\",\\n \\"default\\": true,\\n \\"dns\\": {}\\n}]"},"host": "10.0.96.47","container_name": "nginx","docker_id": "add90ccf49626ef42d5615a636aae74d6380996043cf6f6560d8131f21a4d8ba","container_hash": "nginx@sha256:e1211ac17b29b585ed1aee166a17fad63d344bc973bc63849d74c6452d549b3e","container_image": "nginx"}}
$.kubernetes,解析模式选择 JSON。首先将嵌套 JSON 结构转换为单层 JSON 结构。测试后结果如下所示:{"@timestamp": 1.64880350063659E9,"@filepath": "/var/log/tke-log-agent/test7/c816991f-adfe-4617-8cf3-9997aea90ded/c_tke-es-687995d557-n29jr_default_nginx-add90ccf49626ef42d5615a636aae74d6380996043cf6f6560d8131f21a4d8ba/jgw_INFO_2022-02-10_15_4.log","log": "15:00:00.000[4349811564226374227] [http-nio-8081-exec-64] INFO com.qcloud.jgw.gateway.server.topic.TopicService","$.kubernetes.pod_name": "tke-es-687995d557-n29jr","$.kubernetes.namespace_name": "default","$.kubernetes.pod_id": "c816991f-adfe-4617-8cf3-9997aea90ded","$.kubernetes.labels": {"k8s-app": "tke-es","pod-template-hash": "687995d557","qcloud-app": "tke-es"},"$.kubernetes.annotations": {"qcloud-redeploy-timestamp": "1648016531476","tke.cloud.tencent.com/networks-status": "[{\\n \\"name\\": \\"tke-bridge\\",\\n \\"interface\\": \\"eth0\\",\\n \\"ips\\": [\\n \\"172.16.0.31\\"\\n ],\\n \\"mac\\": \\"ae:61:12:4a:c2:ba\\",\\n \\"default\\": true,\\n \\"dns\\": {}\\n}]"},"$.kubernetes.host": "10.0.96.47","$.kubernetes.container_name": "nginx","$.kubernetes.docker_id": "add90ccf49626ef42d5615a636aae74d6380996043cf6f6560d8131f21a4d8ba","$.kubernetes.container_hash": "nginx@sha256:e1211ac17b29b585ed1aee166a17fad63d344bc973bc63849d74c6452d549b3e","$.kubernetes.container_image": "nginx"}
$.kubernetes.annotations 和 $.kubernetes.labels。在处理链中使用 Map 方式选中这两个名称,即可将嵌套格式转换成单层 JSON 格式。处理后如下所示:{"@timestamp": 1648803500.63659,"@filepath": "/var/log/tke-log-agent/test7/c816991f-adfe-4617-8cf3-9997aea90ded/c_tke-es-687995d557-n29jr_default_nginx-add90ccf49626ef42d5615a636aae74d6380996043cf6f6560d8131f21a4d8ba/jgw_INFO_2022-02-10_15_4.log","log": "15:00:00.000[4349811564226374227] [http-nio-8081-exec-64] INFO com.qcloud.jgw.gateway.server.topic.TopicService","$.kubernetes.pod_name": "tke-es-687995d557-n29jr","$.kubernetes.namespace_name": "default","$.kubernetes.pod_id": "c816991f-adfe-4617-8cf3-9997aea90ded","$.kubernetes.host": "10.0.96.47","$.kubernetes.container_name": "nginx","$.kubernetes.docker_id": "add90ccf49626ef42d5615a636aae74d6380996043cf6f6560d8131f21a4d8ba","$.kubernetes.container_hash": "nginx@sha256:e1211ac17b29b585ed1aee166a17fad63d344bc973bc63849d74c6452d549b3e","$.kubernetes.container_image": "nginx","$.kubernetes.labels.k8s-app": "tke-es","$.kubernetes.labels.pod-template-hash": "687995d557","$.kubernetes.labels.qcloud-app": "tke-es","$.kubernetes.annotations.qcloud-redeploy-timestamp": "1648016531476","$.kubernetes.annotations.tke.cloud.tencent.com/networks-status": "[{\\n \\"name\\": \\"tke-bridge\\",\\n \\"interface\\": \\"eth0\\",\\n \\"ips\\": [\\n \\"172.16.0.31\\"\\n ],\\n \\"mac\\": \\"ae:61:12:4a:c2:ba\\",\\n \\"default\\": true,\\n \\"dns\\": {}\\n}]"}
key 为所需名称,并且删去不需要的字段。此时单击添加处理链后,打开处理上层所有结果的按钮,整理优化后可以参考如下所示:{"@timestamp": 1.64880350063659E9,"@filepath": "/var/log/tke-log-agent/test7/c816991f-adfe-4617-8cf3-9997aea90ded/c_tke-es-687995d557-n29jr_default_nginx-add90ccf49626ef42d5615a636aae74d6380996043cf6f6560d8131f21a4d8ba/jgw_INFO_2022-02-10_15_4.log","log": "15:00:00.000[4349811564226374227] [http-nio-8081-exec-64] INFO com.qcloud.jgw.gateway.server.topic.TopicService","pod_name": "tke-es-687995d557-n29jr","namespace_name": "default","pod_id": "c816991f-adfe-4617-8cf3-9997aea90ded","host": "10.0.96.47","container_name": "nginx","docker_id": "add90ccf49626ef42d5615a636aae74d6380996043cf6f6560d8131f21a4d8ba"}
key 中本身带有英文句号 . 时,需要在路径中方括号和单引号进行隔离。{"key1.key2":"value1"} 中,要想取得对应字段,则需要使用 $.['key1.key2'] 进行获取相应键值。{"key": " {\\n \\"categories\\": [\\"dev\\"],\\n \\"created_at\\": \\"2020-01-05 13:42:19.324003\\",\\n \\"icon_url\\": \\"https://assets.chucknorris.host/img/avatar/chuck-norris.png\\",\\n \\"id\\": \\"elgv2wkvt8ioag6xywykbq\\",\\n \\"updated_at\\": \\"2020-01-05 13:42:19.324003\\",\\n \\"url\\": \\"https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq\\",\\n \\"value\\": \\"Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris.\\"\\n }\\n"}
{"key": " {\\n \\"categories\\": [\\"dev\\"],\\n \\"created_at\\": \\"2020-01-05 13:42:19.324003\\",\\n \\"icon_url\\": \\"https://assets.chucknorris.host/img/avatar/chuck-norris.png\\",\\n \\"id\\": \\"elgv2wkvt8ioag6xywykbq\\",\\n \\"updated_at\\": \\"2020-01-05 13:42:19.324003\\",\\n \\"url\\": \\"https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq\\",\\n \\"value\\": \\"Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris.\\"\\n }\\n"}
JSON。这样数据处理就能将 RAW JSON 自动转换成 JSON 形式。解析后如下所示:{"key.categories": ["dev"],"key.created_at": "2020-01-05 13:42:19.324003","key.icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png","key.id": "elgv2wkvt8ioag6xywykbq","key.updated_at": "2020-01-05 13:42:19.324003","key.url": "https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq","key.value": "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."}
key 为所需名称,并且删去不需要的字段。整理优化后可以参考如下所示:{"categories": ["dev"],"created_at": "2020-01-05 13:42:19.324003","icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png","id": "elgv2wkvt8ioag6xywykbq","updated_at": "2020-01-05 13:42:19.324003","url": "https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq","value": "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."}
"[\\"test1\\",\\"test2\\"]",或者 "[{\\"key\\":\\"value\\"}]",由于无法解析合适的键值,因此将会提示解析失败。文档反馈