如何在SSMS审计日志采集时排除连接池复用的登录记录
SQL Server审计过滤连接池复用登录记录方案
根因说明
你当前日志暴增的核心原因是SUCCESSFUL_LOGIN_GROUP审计组会捕获连接池复用触发的sp_reset_connection对应的虚拟登录事件,这类事件是连接池归还连接后复用前的重置操作,不属于真实用户首次登录,没有审计价值,会产生大量冗余日志。
推荐方案:审计谓词直接在采集阶段过滤(支持SQL Server 2012及以上版本)
SQL Server 2012及更高版本支持为服务器审计配置谓词过滤规则,可以在事件写入审计日志前就排除连接池复用的记录,直接从源端降低日志产生量,不需要事后筛选。
操作步骤如下:
- 先禁用现有服务器审计(修改审计配置必须先禁用)
可以在SSMS右键对应审计项选择「禁用」,也可以执行T-SQL:ALTER SERVER AUDIT [替换为你的审计名称] WITH (STATE = OFF); - 为审计添加过滤规则
连接池复用的登录事件对应action_id为LGI,且additional_information字段中存在<IsPooled>1</IsPooled>标记,我们只需要过滤这类记录即可,其余审计事件(失败登录、数据库身份验证等)全部保留。
执行T-SQL添加规则:
你也可以直接在SSMS审计属性的「谓词」选项卡中,输入上述WHERE子句后的规则内容。ALTER SERVER AUDIT [替换为你的审计名称] WHERE ( action_id <> 'LGI' OR ( action_id = 'LGI' AND CONVERT(XML, additional_information).exist('//IsPooled[text()="1"]') = 0 ) ); - 重新启用审计
SSMS右键审计项选择「启用」,或者执行T-SQL:ALTER SERVER AUDIT [替换为你的审计名称] WITH (STATE = ON);
低版本兼容方案(SQL Server 2008/2008R2)
如果你的SQL Server版本不支持审计谓词,可以调整审计组配置:
- 保留
FAILED_LOGIN_GROUP和SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP,这两个组不会被连接池复用事件触发 - 移除
SUCCESSFUL_LOGIN_GROUP,改用扩展事件(Extended Events)捕获真实登录事件,扩展事件本身性能损耗更低,也支持自定义过滤规则,同样可以排除连接池复用记录。
效果验证
配置完成后可以执行以下查询确认过滤效果:
SELECT event_time, session_id, server_principal_name, additional_information FROM sys.fn_get_audit_file('替换为你的审计日志路径\*.sqlaudit', DEFAULT, DEFAULT) WHERE action_id = 'LGI';
检查返回结果的additional_information字段,确认没有<IsPooled>1</IsPooled>的记录即表示过滤生效。
内容的提问来源于stack exchange,提问作者Joe G
相关产品推荐
相关产品推荐

