如何在Delphi的FireDAC连接中仅捕获mysql_real_query?
只捕获FireDAC日志中的mysql_real_query事件
我完全懂你的困扰——开了ekVendor之后一堆无关的MySQL底层日志涌进来,而你只盯着mysql_real_query这部分内容。其实不用在EventKinds的开关里死磕,咱们可以通过自定义日志过滤逻辑精准锁定目标,具体操作如下:
1. 先做基础配置:启用ekVendor
首先还是得把TFDMoniCustomClientLink的EventKinds属性设为[ekVendor],因为mysql_real_query属于MySQL厂商专属的事件类型,只有开了这个类别才能拿到对应的日志内容。
2. 用OnOutput事件拦截过滤
TFDMoniCustomClientLink自带的OnOutput事件是关键,咱们可以在这里拦截每一条输出的日志,只保留包含mysql_real_query的完整段落。
代码示例:
var FCapturingParagraph: Boolean; FTargetLog: TStringList; begin // 初始化存储目标日志的容器 FTargetLog := TStringList.Create; FCapturingParagraph := False; // 绑定日志输出的处理逻辑 FDMoniCustomClientLink1.OnOutput := procedure(Sender: TObject; const AMessage: string; const AParams: array of string) var LogLine: string; begin LogLine := Format(AMessage, AParams); // 触发捕获:当行内容包含mysql_real_query时,开始记录整个段落 if Pos('mysql_real_query', LogLine) > 0 then begin FCapturingParagraph := True; FTargetLog.Add(LogLine); end // 持续捕获直到段落结束(这里假设段落以空行分隔,根据你的实际日志格式调整) else if FCapturingParagraph then begin if Trim(LogLine) = '' then FCapturingParagraph := False else FTargetLog.Add(LogLine); end; end; // 后续可将捕获到的日志保存到文件 // FTargetLog.SaveToFile('mysql_real_query_logs.log'); end;
3. 适配你的日志格式
上面的代码默认用空行判断段落结束,你需要根据实际生成的日志调整这个逻辑:比如有些FireDAC日志里,每个厂商事件段落会以---这类分隔符结尾,那就把判断空行的代码改成检查分隔符即可。
4. 可选优化:去重或标记时间
如果你的程序高频执行查询,可能会出现重复的mysql_real_query日志,你可以在FTargetLog里加入去重逻辑,或者给每条日志加上时间戳,方便区分不同的查询事件。
这套方案就能帮你精准过滤掉冗余内容,只保留你需要的mysql_real_query相关日志。
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

