GCP StackDriver中DialogFlow日志无json_payload的技术咨询
关于DialogFlow Stackdriver日志无json_payload的解决方案
一、是否有设置可以启用json_payload?
很遗憾,目前DialogFlow V2版本在Stackdriver中记录的请求/响应日志,确实默认只有text_payload格式,没有官方设置可以直接切换为结构化的json_payload。这是因为DialogFlow的日志输出机制就是把原本的结构化数据(请求是JSON、响应是Protobuf)序列化成文本后,存入text_payload字段的。
二、解析text_payload的实用方法
既然没法直接拿到结构化格式,我们可以通过以下几种方式来提取所需数据:
1. 自定义脚本解析(适合批量处理)
针对请求和响应日志的不同格式,写脚本针对性解析:
解析请求日志(JSON嵌套文本)
请求的text_payload里是Dialogflow Request : {嵌套JSON字符串}的格式,可以先截取JSON部分,再处理转义字符后解析:
import json def parse_dialogflow_request(text_payload): # 提取JSON部分 try: json_part = text_payload.split("Dialogflow Request : ")[1] # 处理转义的引号和换行符 cleaned_json = json_part.replace('\\"', '"').replace("\\n", "\n") return json.loads(cleaned_json) except (IndexError, json.JSONDecodeError) as e: print(f"解析失败: {str(e)}") return None # 示例使用 sample_payload = 'Dialogflow Request : {"session":"44885105","query_input":"{\n \"event\": {\n \"name\": \"WELCOME\",\n \"parameters\": {\n }\n }\n}"},"timezone":"Australia/Sydney"' parsed_result = parse_dialogflow_request(sample_payload) print(parsed_result["session"]) # 输出 44885105
解析响应日志(Protobuf文本格式)
响应日志是Protobuf的文本序列化格式,需要用Protobuf工具库来解析:
首先安装依赖:
pip install protobuf googleapis-common-protos
然后获取DialogFlow的detect_intent.proto定义,生成Python解析类后,用以下脚本解析:
from google.protobuf import text_format from dialogflow_v2_pb2 import DetectIntentResponse from google.protobuf.json_format import MessageToDict def parse_dialogflow_response(text_payload): try: proto_part = text_payload.split("Dialogflow Response : ")[1] response = DetectIntentResponse() text_format.Merge(proto_part, response) # 转成字典方便后续处理 return MessageToDict(response) except (IndexError, text_format.ParseError) as e: print(f"解析失败: {str(e)}") return None # 示例使用 sample_payload = 'Dialogflow Response : id: "05f6f343-a646-42e0-8181-48c2e853e21b-0820055c"\nlang: "en"\nsession_id: "44885105"\ntimestamp: "2020-08-07T04:11:29.747Z"\nresult {\n source: "agent"\n resolved_query: "WELCOME"\n action: "input.welcome"\n score: 1.0\n parameters {\n }\n contexts {\n name: "defaultwelcomeintent-followup"\n lifespan: 2\n parameters {\n }\n }\n metadata {\n intent_id: "22498e9a-efcf-43e0-a945-36a7ef4c702d"\n intent_name: "Default Welcome Intent"\n webhook_used: "false"\n webhook_for_slot_filling_used: "false"\n is_fallback_intent: "false"\n }\n fulfillment {\n speech: "Hey Good Day! what kind of issue do you want to report?"\n messages {\n lang: "en"\n type {\n number_value: 0.0\n }\n speech {\n string_value: "Hey Good Day! what kind of issue do you want to report?"\n }\n }\n }\n}\nstatus {\n code: 200\n error_type: "success"\n}\n' parsed_result = parse_dialogflow_response(sample_payload) print(parsed_result["sessionId"]) # 输出 44885105
2. 用Stackdriver Log Explorer直接提取字段
如果只是临时查询分析,可以用Log Explorer的正则提取功能,比如提取请求日志中的会话ID和意图名称:
resource.type="global" logName="projects/ai-hackathon-2020-lrwc/logs/dialogflow_agent" labels.type="dialogflow_request" | regexp_extract(textPayload, r'Dialogflow Request : \{\"session\":\"([^\"]+)\"') as session_id | regexp_extract(textPayload, r'\"name\": \"([^\"]+)\"') as intent_name | select session_id, intent_name, timestamp
3. 自动转换并存入数据仓库
如果需要长期分析,可以用Cloud Functions监听Stackdriver日志,自动解析text_payload后存入BigQuery,后续直接在BigQuery中做仪表盘分析。具体步骤是:
- 创建Cloud Functions,触发源选择“Cloud Logging”,指定DialogFlow的日志过滤器
- 在函数中解析日志的
text_payload,将结构化数据写入BigQuery表 - 后续直接基于BigQuery的数据做可视化分析
内容的提问来源于stack exchange,提问作者laventy
相关产品推荐
相关产品推荐

