首页 > 解决方案 > 如何跟踪服务火鸟

问题描述

如何使用delphi xe10跟踪服务firebird服务器的所有事件?这是我的代码:

my := TIBControlService.Create(Self);

my.ServerName := '127.0.0.1/3050';
my.Protocol := TProtocol.TCP;

my.LoginPrompt := false;
my.TraceFlags := [tfQPrepare, tfQExecute, tfQFetch, tfError, tfStmt, tfConnect, tfTransact, tfBlob, tfService, tfMisc];

my.Params.Add( 'user_name=SYSDBA' );
my.Params.Add( 'password=masterkey' );

// -----
mh := MonitorHook;
mh.TraceFlags := my.TraceFlags;

Self.IBSQLMonitor1.TraceFlags := my.TraceFlags;
mh.RegisterMonitor(Self.IBSQLMonitor1);

Self.IBSQLMonitor1.Enabled := true;
Memo1.Lines.Add( Format('GetMonitorCount: %d',[mh.GetMonitorCount]) );


my.Attach;

Memo1.Lines.Add( Format('Active: %s',[System.StrUtils.IfThen(my.Active,'yes','no')]) );

procedure TForm1.IBSQLMonitor1SQL(EventText: string; EventTime: TDateTime);
begin
    Memo1.Lines.Add(EventText);
end;

结果:

GetMonitorCount: 1
Active: yes

[Application:]
:[Attach]

[Application:]
:[Query]

但这个结果仅来自我的应用程序。当我从另一个进程(ex.isql)连接时,我的应用程序不显示此事件。

标签: delphimonitoringfirebirdtrace

解决方案


  1. 在谈论 Interbase/Firebird 时,术语EVENT具有非常特定的含义,即向订阅了这些文本常量的客户端发送文本常量的特定 SQL 命令。

    请参阅http://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql-coding.html#fblangref25-psql-postevent

    但是,客户端应该订阅与 PSQL 块发布的完全相同的文本字符串。有关于启用基于掩码的订阅的讨论,这可能使订阅所有 SQL 事件成为可能,例如*.*匹配 Windows 中的所有文件,但据我所知,它们从未实现。

    这就是 Firebird 中“事件”的含义,但它似乎不是您的意思,相反,它看起来您想要监视 SQL 服务器和所有应用程序之间流动的所有类型的活动,从 SQL 命令等开始。

    如果是这样,那么一般来说没有办法做到这一点。你必须决定你到底想要什么以及为什么想要,也许会有一些部分解决方案。

  2. Firebird 2.5 引入了所谓的Trace API,它允许您订阅一些操作并收到通知。但是,这往往会给引擎带来很大的负载,具体取决于您的订阅过滤器的模糊程度以及服务器接收到的请求数量 - 它可能会增加 RAM 和 CPU 使用率,直至完全无法使用。

    • 可以订阅的活动种类是有限的。例如,读取 BLOB 的过程不受监控。当我问起——我正在为由Delphi dbExpress库怪癖触发的臭名昭著的“无效 BLOB id”而苦苦挣扎时——我被告知“没有人需要这个,你也没有什么理由需要它。你做了一个演示项目,将其发送给我们 - 我们为您解释了这种行为”。那时让 BLOB 访问跟踪对我有很大帮助,但客观地说,这是我真正需要它的唯一情况。

    • 您可能会看一下使用Firebird Trace Manager(从 2.5 开始,它是 FB 发行版的一部分)的 CLI 实用程序通常可以获得什么。

    • 您可以看看Firebird Profiler ,这是一个来自http://fbprofiler.sf.net的免费简单 GUI 工具

    • Firebird 的商业 DB IDE,如 IBExpert 或 UpScene TraceManager 以及可能还有其他的,通常都支持 Trace API。

    • 您可以使用 Trace API 进行自己的实现,从Program Files\Firebird\Firebird_2_5\doc\README.trace_services.txt和开始Program Files\Firebird\Firebird_2_5\include\ibase.h。也可能发生诸如Unified InterbaseIBObjects之类的 3rd 方库已将 API 转换为 Delphi。我想我在UIB中看到了一些关于跟踪的信息,但我不确定。我不希望这样的库成为Delphi发行版的一部分:从Delphi的角度来看, Firebird是他们的Interbase的直接竞争对手,而IBX库几乎没有兴趣通过支持Firebird -only 功能来偏离他们自己的Interbase 。

  3. 如果您只关心像 Delphi 这样的本机应用程序,您可能会决定制作自己的插入器fbclient.dll并将其安装在所有客户端计算机上,而不是库存 DLL。如果您的应用程序使用旧版模拟GDS32.DLL ,则相同。

    • 这个 DLL 应该完全提供所有 API 调用,包括在http://firebirdsql.org/en/reference-manuals/的 IB6 文档中描述的经典调用以及所有后 IB6 更新,以及新的 Firebird 3“面向对象的 API” .
    • 它应该以您选择的方式记录调用,然后应该将调用代理到原始客户端 DLL 的副本,您将使用不同的文件名为其隐藏该副本。它应该安装在您想要拦截和监视的每台计算机上,而不是标准客户端 DLL。
    • 使用经典 API 应该不会很难,人们正在这样做,虽然没有发布。但新的 ooAPI 可能具有挑战性。
    • 它只会拦截应用程序,通过fbclient.DLL接口工作。使用Jaybird的Java 应用程序和使用.Net Provider库的C# 应用程序可能会使用底层有线协议,从而跳过fbclient.dll以及您的插入器。

推荐阅读