Joe Obbish Asked: 2024-03-13 03:53:24 +0800 CST2024-03-13 03:53:24 +0800 CST 2024-03-13 03:53:24 +0800 CST 如何防止 SQL Server 将 XE 会话的启动和停止记录到服务器日志文件中? 772 我有一个启动和停止扩展事件会话的进程,以便将数据从事件文件传输到 SQL 表中。在 SQL Server 2022 RTM 服务器上,我看到此进程写入日志文件中的许多行: 我希望 XE 会话的启动和停止不写入日志文件,因为我的日志文件现在充满了这些条目。Microsoft SQL Server 2019 (RTM-CU22-GDR) 实例上不会发生此行为。 如何防止 SQL Server 将 XE 会话的启动和停止记录到服务器日志文件中? sql-server 1 个回答 Voted Best Answer Sean Gallardy 2024-03-13T09:10:28+08:002024-03-13T09:10:28+08:00 读者注意:这是使用Microsoft Symbols Server中的公共符号完成的。 对于 SQL Server 2022 RTM,错误日志启动项和停止项分别在XEventController::AlterEventSession和函数中生成。XEventController::VLR_StopXESession::CommitAndReleasesqllang.dll 开始写入 先看start函数,这是一个非常大的函数,0x107e之前的调用: sqllang!XEventController::AlterEventSession+0x106d: 00007ff8`d1fa940d 488d95c80a0000 lea rdx,[rbp+0AC8h] 00007ff8`d1fa9414 b999640000 mov ecx,6499h 00007ff8`d1fa9419 e8a2f62301 call sqllang!scierrlog into正在加载并传递给mov我们,我们可以推断出写入消息的错误号,这确实( ) 与公共文档匹配。ecx0x6499sqllang!scierrlog0x64990n25753 25753 XE 会话“%s”已启动。 查看可能运行代码的项目,有一个分支指向该方向sqllang!XEventController::AlterEventSession+0x101f 00007ff8`d1fa93d5 488d542468 lea rdx,[rsp+68h] 00007ff8`d1fa93da 488d8d900a0000 lea rcx,[rbp+0A90h] 00007ff8`d1fa93e1 ff1551e52a02 call qword ptr [sqllang!XE_API::sm_ClientAPI+0xa8 (00007ff8`d4257938)] 00007ff8`d1fa93e7 85c0 test eax,eax 00007ff8`d1fa93e9 7522 jne sqllang!XEventController::AlterEventSession+0x106d 似乎没有跟踪标志或其他容易设置的检查,事实上它似乎依赖于函数指针的返回sqllang!XE_API::sm_ClientAPI+0xa8。我想说,对于启动错误日志项,没有一种易于配置的方法来将其关闭。 鉴于您现在知道在哪里可以找到它,您可以注入自己的代码和NOP(或)显然不支持的jmp调用。scierrlog 查看 SQL Server 2019 CU24 实例,同一函数没有对错误日志的引用,并且有许多不同的更改。该功能似乎是在 2022 年添加的,但没有向后移植到 2019 年。 停止写入 有趣的是,停止不在同一个函数中,因为开始是AlterEventSession人们认为将用于ALTER事件会话的 T-SQL 命令🤷♂️ 幸运的sqllang!XEventController::VLR_StopXESession::CommitAndRelease是,它的函数要小得多。根据我们从之前的函数调查中学到的知识,将加载ecx相应的错误号,然后调用scierrlog. 果然,它就在那里,而且很容易在函数的开头找到! 00007ff8`d1fa8105 488d9570020000 lea rdx,[rbp+270h] 00007ff8`d1fa810c 488b4938 mov rcx,qword ptr [rcx+38h] 00007ff8`d1fa8110 ff152af82a02 call qword ptr [sqllang!XE_API::sm_ClientAPI+0xb0 (00007ff8`d4257940)] 00007ff8`d1fa8116 488d95a8020000 lea rdx,[rbp+2A8h] 00007ff8`d1fa811d b99a640000 mov ecx,649Ah 00007ff8`d1fa8122 e899092401 call sqllang!scierrlog 这里我们可以看到( ) 加载了ecx32 位值,然后调用了,奇怪的是在此之前有一个类似的调用,但偏移量却大不相同。无论如何,调用的返回没有条件测试,因此它总是将其写入错误日志,并且似乎根本不受跟踪标志或其他机制的控制。这比开始组装要直接得多。0x649A0n25754scierrlogsqllang!XE_API::sm_ClientAPI 25754 XE 会话“%s”正在停止。 同样的选项也适用于此,用 s 覆盖 call 指令NOP。 针对前面提到的相同 SQL 2019 CU24 实例检查此函数,还会在函数开头显示相当多不同的代码,这似乎没有错误日志调用,也没有向后移植(无论好坏)。 最努力 可以说可以支持的一种方法是制作一个非常小的文件系统过滤器驱动程序来检查专门对错误日志文件的文件写入,并检查正在写入的数据是否是您真正不想要的数据。然后你可以悄悄地把它扔掉,没有人会知道,日志也不会显示它,并且希望过滤器驱动程序不会有错误或破坏环境中的任何其他内容。 最省力 向 Microsoft 提交支持票证,并要求对产品进行更改,以选择关闭消息记录的选项,以便有支持的方式。
读者注意:这是使用Microsoft Symbols Server中的公共符号完成的。
对于 SQL Server 2022 RTM,错误日志启动项和停止项分别在
XEventController::AlterEventSession
和函数中生成。XEventController::VLR_StopXESession::CommitAndRelease
sqllang.dll
开始写入
先看start函数,这是一个非常大的函数,0x107e之前的调用:
into正在加载并传递给
mov
我们,我们可以推断出写入消息的错误号,这确实( ) 与公共文档匹配。ecx
0x6499
sqllang!scierrlog
0x6499
0n25753
查看可能运行代码的项目,有一个分支指向该方向
sqllang!XEventController::AlterEventSession+0x101f
似乎没有跟踪标志或其他容易设置的检查,事实上它似乎依赖于函数指针的返回
sqllang!XE_API::sm_ClientAPI+0xa8
。我想说,对于启动错误日志项,没有一种易于配置的方法来将其关闭。鉴于您现在知道在哪里可以找到它,您可以注入自己的代码和
NOP
(或)显然不支持的jmp
调用。scierrlog
查看 SQL Server 2019 CU24 实例,同一函数没有对错误日志的引用,并且有许多不同的更改。该功能似乎是在 2022 年添加的,但没有向后移植到 2019 年。
停止写入
有趣的是,停止不在同一个函数中,因为开始是
AlterEventSession
人们认为将用于ALTER
事件会话的 T-SQL 命令🤷♂️幸运的
sqllang!XEventController::VLR_StopXESession::CommitAndRelease
是,它的函数要小得多。根据我们从之前的函数调查中学到的知识,将加载ecx
相应的错误号,然后调用scierrlog
. 果然,它就在那里,而且很容易在函数的开头找到!这里我们可以看到( ) 加载了
ecx
32 位值,然后调用了,奇怪的是在此之前有一个类似的调用,但偏移量却大不相同。无论如何,调用的返回没有条件测试,因此它总是将其写入错误日志,并且似乎根本不受跟踪标志或其他机制的控制。这比开始组装要直接得多。0x649A
0n25754
scierrlog
sqllang!XE_API::sm_ClientAPI
同样的选项也适用于此,用 s 覆盖 call 指令
NOP
。针对前面提到的相同 SQL 2019 CU24 实例检查此函数,还会在函数开头显示相当多不同的代码,这似乎没有错误日志调用,也没有向后移植(无论好坏)。
最努力
可以说可以支持的一种方法是制作一个非常小的文件系统过滤器驱动程序来检查专门对错误日志文件的文件写入,并检查正在写入的数据是否是您真正不想要的数据。然后你可以悄悄地把它扔掉,没有人会知道,日志也不会显示它,并且希望过滤器驱动程序不会有错误或破坏环境中的任何其他内容。
最省力
向 Microsoft 提交支持票证,并要求对产品进行更改,以选择关闭消息记录的选项,以便有支持的方式。