我正在尝试解析具有混合格式的 Datadog 日志。
我有一些日志传入 Datadog,如下所示:
... some_field="value123" org_id="test-org-id" query_params="{"updated_date": {"eq": "2020-01-01T00:00:00Z", "lte": "2025-01-01T00:00:00Z"}, "active": {"eq": true}}" request_id="test-request-id" request_method="GET" ... Response: {"data": []}
到目前为止,我一直在 Grok 解析器中使用以下规则来解析它们:
rule ...%{some_field}?%{org_id}?%{query_params}?%{request_id}?%{request_method}?...%{regex(".*"):msg}
org_id (%{regex("org_id=")}\"%{regex("[a-zA-Z_0-9\\-]+"):org_id}\"\s)
query_params (%{regex("query_params=")}\"%{regex("\\{.*\\}"):query_params}\"\s)
request_id (%{regex("request_id=")}\"%{regex("[a-zA-Z_0-9\\-\\=]+"):request_id}\"\s)
request_method (%{regex("request_method=")}\"%{regex("[a-zA-Z]+"):request_method}\"\s)
输出如下:
{
"msg": "Response: {"data": []}",
"request_method": "GET",
"org_id": "test-org-id",
"query_params": "{\"updated_date\": {\"eq\": \"2020-01-01T00:00:00Z\", \"lte\": \"2025-01-01T00:00:00Z\"}, \"active\": {\"eq\": true}}",
"request_id": "test-request-id"
}
我愿意:
将查询参数解析为 JSON,这样它们就可以像这样输出
{
"msg": "Response: {"data": []}",
"request_method": "GET",
"org_id": "test-org-id",
"query_params": {
"updated_date": {
"eq": "2020-01-01T00:00:00Z",
"lte": "2025-01-01T00:00:00Z"
},
"active": true
}
"request_id": "test-request-id"
}
获取有关简化我的主规则的任何建议。我尝试过这样的事情:
api_rule %{celery_prefix}?\s*%{data::keyvalue}?%{query_params}?%{data::keyvalue}?%{regex("Response: .*"):msg}
但由于某种原因它丢弃了 query_params 中的数据。
我可以控制日志的输出方式,因此如果需要从后端更改任何内容,这也是一个选项。
谢谢!
在 Datadog 支持人员的帮助下解决了。
updated_api_rule %{regex(".+?(?=query_params)")::keyvalue}query_params="%{regex("\\{.*\\}"):query_params:json}%{regex(".+?(?=Response)")::keyvalue}%{data:msg}