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