我正在分析我们的ASP .NET应用程序,试图减少CPU使用率,并喜欢NHibernate和log4net的一些奇怪的行为. 我们应用程序上超过50%的时间花在了log4net GetLogger和CreateRepository方法上,这些方法是从N
我们应用程序上超过50%的时间花在了log4net GetLogger和CreateRepository方法上,这些方法是从NHibernate中的ExecuteReader调用的.下面的截图是jetBrains dottrace热点分析,其中箭头指向调用方法到被调用方法.
下面的屏幕截图只是最慢功能的直接列表.您可以看到NHybridDataReader构造函数调用GetLogger并且需要很长时间.
显然有些可疑,我想在NHibernate中完全禁用log4net,因为我们使用其他日志记录功能.
我们的web.config中没有关于log4net的条目,所以如何禁用它?没有生成日志文件,从方法名称的外观来看,它实际上并没有记录任何东西,而只是试图找到应该写入东西的记录器.
最令人困惑的是,有人可以帮忙吗?
要回答您的具体问题(关闭NHibernate对log4net的使用),请查看NHibernate的Logging.cs文件的代码.当我查看它时(授予,我查看了3.0 alpha代码,但我怀疑它与2.x有很大不同),在静态LoggerProvider构造函数中,它委托GetNHibernateLoggerClass来确定要使用的类.如果它没有得到,它使用基于无操作的类.因此,如果您查看GetNHibernateLoggerClass方法,您会看到它首先查找名为“nhibernate-logger”的appsettings键,您应该可以将其设置为“NHibernate.NoLoggingLoggerFactory,NHibernate”.您可能还注意到缺少已定义的密钥,如果它在搜索路径中找到log4net DLL,它会自动使用log4net(可能只是包含NHibernate DLL的目录.所以您可能还想尝试删除log4net DLL本身,看看会发生什么虽然第一个解决方案更明确,第二个解决方案更加推断,所以我会先使用第一个解决方案.作为旁注,这是开源工作原理如此之好的一个很好的例子.能够通过源代码来回答这样的问题.在封闭源代码中,您要么必须作弊,要么.NET反射代码(可能会被混淆),或者祈祷所有者严重记录了像这样的模糊点.
顺便说一句,这个相同的源代码文件提供了如果您想要获取NHibernate的日志消息并将它们重定向到您自己的日志记录解决方案所需的内容,正如您所提到的那样(实现ILogger和ILoggerFactory接口并使用配置设置).