You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:59:40