特定于日志的NHibernate SQL查询

特定于日志的NHibernate SQL查询,nhibernate,log4net,Nhibernate,Log4net,我知道如何配置NHibernate和log4net来记录查询的结果SQL。但是,是否可以只记录特定查询(例如,在LINQ查询之前激活日志记录活动,并在查询之后立即将其停用)?您可以通过编程方式向log4net实例添加和删除附加器。因此,您可以做的是,当您点击要记录的查询时,以编程方式添加新的appender,运行查询,然后以编程方式删除appender。我还没有测试过这一点,但我认为这应该是可能的 了解如何以编程方式添加附加程序。您可以使用拦截器自己记录SQL,在需要时可以启用拦截器 publi

我知道如何配置NHibernate和log4net来记录查询的结果SQL。但是,是否可以只记录特定查询(例如,在LINQ查询之前激活日志记录活动,并在查询之后立即将其停用)?

您可以通过编程方式向log4net实例添加和删除附加器。因此,您可以做的是,当您点击要记录的查询时,以编程方式添加新的appender,运行查询,然后以编程方式删除appender。我还没有测试过这一点,但我认为这应该是可能的


了解如何以编程方式添加附加程序。

您可以使用拦截器自己记录SQL,在需要时可以启用拦截器

public class SqlLogInterceptor : EmptyInterceptor
{
    private static readonly ILog _log =
        LogManager.GetLogger(typeof(SqlLogInterceptor ));

    public bool Enabled { get; set; }

    public override SqlString OnPrepareStatement(SqlString sql)
    {
        // Adjust your log level as you see fit.
        if (Enabled)
            _log.Info(sql);
        return sql;
    }    
}
打开会话时,向
OpenSession
提供拦截器实例,并在其上保留引用

当需要日志记录时,设置其
Enabled
属性。如果您只在一个会话中使用了拦截器实例,那么它将只记录该会话SQL


此解决方案不会记录参数值。

谢谢。在您看来,这是只记录特定(复杂)查询的正确方法吗?是的,这是我尝试的方法。您应该能够以编程方式打开所需的日志记录,执行查询,然后关闭日志记录。我很肯定这条路线上的某些东西会奏效;然而,我自己并没有亲自测试过,这会导致并发会话的查询被记录下来。但是如果OP想要使用NHibernate内置日志记录,而不是一些定制的日志记录,我认为没有其他解决方案可用。