我有一个应用程序(一个自托管ASP.Net WebAPI的控制台应用程序),它正在调用XmlConfigurator.Configure()
作为其设置的一部分。
如果我的应用程序的app.config
文件如下所示,它可以正常工作:
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
</log4net>
</configuration>
如果我取出空的<log4net>
元素,它就会挂起:
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
</configuration>
在过去使用log4net时,我没有在其他地方看到过这种行为(它通常只是将消息“log4net:ERROR XmlConfigurator:在应用程序的.config文件中找不到配置部分'log4net'。”控制台)。
我做错了什么,或者我偶然发现了log4net中的错误?
我对此进行了广泛的调试。有两种行为:
答案 0 :(得分:4)
由于this blog post,我最终得到了这一点。
它基本上归结为我在我的机器上安装了.Net 4.5。即使我的目标是.Net 4.0,但由于.Net 4.5的替换性质,性能也不同。
如果配置文件中没有空<log4net>
元素,则log4net想要写入标准错误以通知该元素为空。没有元素,就不会发生日志记录。当日志确实发生时(发生在与应用程序中其他控制台使用不同的线程上),它会导致由.Net 4.5中的控制台初始化方式的更改引起的死锁(详见链接的博客文章)。 p>
答案 1 :(得分:0)
您的配置告诉XmlConfigurator管理器有一个名为Log4Net的部分。 所以你的XmlConfigurator试图加载该部分并抱怨 我敢说这是可以预料的 如果删除configSections中声明的任何部分,您将获得与任何派生的Configuration类相同的行为。
答案 2 :(得分:0)
尝试这样的事情,我在我的.config文件之后 设置
在您的页面中声明类似这样的内容
private static log4Net.ILog _logger = log4net.LogManager.GetLoggger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
<log4net>
<root>
<level value="ALL"/>
<appender-ref ref="LogFileAppender"/>
</root>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File value="c:\Logs\SampleLog.txt"/>
<param name="AppendToFile value="true"/>
<rollingStyle value="Size"/>
<maximumFileSize value="2MB"/>
<staticLogFileName value="false"/>
<datePattern value="yyyyMMdd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger -%message%newline"/>
</layout>
</appender>
</log4net>