Nhibernate-使用特定ISession或ISessionFactory的日志记录
我们使用的是NHibernate 3.2 我希望能够记录来自特定ISession的SQL查询。可能吗 或者,如果不可能,我可以将记录器设置为特定的ISessionFactory吗?然后我可以从这个特定的工厂创建这个会话 据我所见,要设置记录器,必须执行以下操作:Nhibernate-使用特定ISession或ISessionFactory的日志记录,nhibernate,Nhibernate,我们使用的是NHibernate 3.2 我希望能够记录来自特定ISession的SQL查询。可能吗 或者,如果不可能,我可以将记录器设置为特定的ISessionFactory吗?然后我可以从这个特定的工厂创建这个会话 据我所见,要设置记录器,必须执行以下操作: <appSettings> <add key="nhibernate-logger" value="NH3SQLLogger.LoggerFactory, NH3SQLLogger" /> <
<appSettings>
<add key="nhibernate-logger" value="NH3SQLLogger.LoggerFactory, NH3SQLLogger" />
</appSettings>
var config = new Configuration();
config.Configure();
config.SetProperty("nhibernate-logger",
"NH3SQLLogger.LoggerFactory, NH3SQLLogger");
_sessionFactory = config.BuildSessionFactory();
这样行吗?或者有其他方法吗?否,您只能全局指定记录器。做你想做的事情会相当复杂 您需要: 编写自己的iLogger工厂实现 从NHibernate.SQL捕获日志数据以捕获所有SQL 从NHibernate.Impl.SessionImpl捕获日志数据,以捕获哪个ISession和ISessionFactory生成了SQL。 将逻辑编码为忽略所有SQL,但由命名的ISessionFactory生成的SQL除外。 以下是一些让您开始学习的代码:
public class LoggerFactory : ILoggerFactory
{
#region Implementation of ILoggerFactory
/// <summary>
/// Returns the logger for a given key name
/// </summary>
/// <param name="keyName">Key or class name</param>
/// <returns>Logger</returns>
public IInternalLogger LoggerFor( string keyName )
{
if ( string.IsNullOrWhiteSpace( keyName ) )
return new NoLoggingInternalLogger();
switch ( keyName )
{
case "NHibernate.SQL":
return new SqlLogger(); // Create this class to capture the SQL
case "NHibernate.Impl.SessionImpl":
return new SessionLogger(); // Create this class to capture ISession-related stuff
default:
return new NoLoggingInternalLogger();
}
}
/// <summary>
/// Returns the logger for a given type
/// </summary>
/// <param name="type">Class name</param>
/// <returns>Logger</returns>
public IInternalLogger LoggerFor( Type type )
{
return LoggerFor( type.FullName );
}
#endregion Implementation of ILoggerFactory
}
不可以,只能全局指定记录器。做你想做的事情会相当复杂 您需要: 编写自己的iLogger工厂实现 从NHibernate.SQL捕获日志数据以捕获所有SQL 从NHibernate.Impl.SessionImpl捕获日志数据,以捕获哪个ISession和ISessionFactory生成了SQL。 将逻辑编码为忽略所有SQL,但由命名的ISessionFactory生成的SQL除外。 以下是一些让您开始学习的代码:
public class LoggerFactory : ILoggerFactory
{
#region Implementation of ILoggerFactory
/// <summary>
/// Returns the logger for a given key name
/// </summary>
/// <param name="keyName">Key or class name</param>
/// <returns>Logger</returns>
public IInternalLogger LoggerFor( string keyName )
{
if ( string.IsNullOrWhiteSpace( keyName ) )
return new NoLoggingInternalLogger();
switch ( keyName )
{
case "NHibernate.SQL":
return new SqlLogger(); // Create this class to capture the SQL
case "NHibernate.Impl.SessionImpl":
return new SessionLogger(); // Create this class to capture ISession-related stuff
default:
return new NoLoggingInternalLogger();
}
}
/// <summary>
/// Returns the logger for a given type
/// </summary>
/// <param name="type">Class name</param>
/// <returns>Logger</returns>
public IInternalLogger LoggerFor( Type type )
{
return LoggerFor( type.FullName );
}
#endregion Implementation of ILoggerFactory
}
谢谢你的详细回答,兰迪。但是,我对这个解决方案有点担心,因为这意味着这个记录器将对系统中的每个会话执行,这将导致全局性能下降。是否没有其他方法(例如不进行日志记录)可以从特定会话获取完整的SQL?另外,如果可以,请看一下下面的问题:谢谢@不幸的是,我不知道有任何其他方法可以访问完整的SQL查询字符串和参数。是的,创建一个客户工厂将导致某种性能下降。我也看了你的后续问题,但我没有任何其他贡献,因为我从来没有做过类似的事情。祝你好运!谢谢你的详细回答,兰迪。但是,我对这个解决方案有点担心,因为这意味着这个记录器将对系统中的每个会话执行,这将导致全局性能下降。是否没有其他方法(例如不进行日志记录)可以从特定会话获取完整的SQL?另外,如果可以,请看一下下面的问题:谢谢@不幸的是,我不知道有任何其他方法可以访问完整的SQL查询字符串和参数。是的,创建一个客户工厂将导致某种性能下降。我也看了你的后续问题,但我没有任何其他贡献,因为我从来没有做过类似的事情。祝你好运!