c#应用程序使用log4net组建输出不了日志问题的解决

按网络资料,在C# winform应用程序中使用log4net组建输出日志。

1、引用log4net.dll

2、在AssemblyInfo.cs中增加[assembly: log4net.Config.XmlConfigurator(Watch = true)],如果log4net的配置在另外独立的log4net.config文件中,则在AssemblyInfo.cs中增加[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config",Watch = true)];

3、在程序默认的app.config文件中增加log4net的配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>

  <log4net>
    <appender name="errorAppender" type="log4net.Appender.RollingFileAppender">
      <filter type="log4net.Filter.LevelMatchFilter">
        <levelToMatch value="ERROR" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
      <file value="Logs\err.log" />
      <encoding value="utf-8"/>
      <preserveLogFileNameExtension value="true" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="yyyyMMdd" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>

。。。
    <logger name="ALLLOG">
      <level value="ALL" />
      <appender-ref ref="errorAppender" />
     </logger>
    </log4net>

。。。
 </configuration>

 

在程序中:

log4net.ILog log = log4net.LogManager.GetLogger("ALLLOG");//获取一个日志记录器

log.Info(DateTime.Now.ToString() + ": login success");//写入一条新log

 

没有生成任何日志文件!!!NND怎么回事?反复调测,查看配置和代码,都没有任何问题。最终看VS的调试启动过程的输出信息发现N个错误:

。。。

--- 内部异常堆栈跟踪的结尾 ---
   在 System.Configuration.ConfigurationManager.PrepareConfigSystem()
   在 System.Configuration.ConfigurationManager.get_AppSettings()
   在 log4net.Util.SystemInfo.GetAppSetting(String key)
log4net:ERROR Exception while reading ConfigurationSettings. Check your .config file is well formed XML.
System.Configuration.ConfigurationErrorsException: 配置系统未能初始化 ---> System.Configuration.ConfigurationErrorsException: 每个配置文件中只允许存在一个 <configSections> 元素,并且,如果存在该元素,它还必须是根 <configuration> 元素的第一个子元素。 (D:\。。。.vshost.exe.config line 6)

看到没有?坑爹的设计啊,log4net要求configSections元素要在配置文件的第一个子元素位置

于是把VS默认生成的startup元素移动到文件末尾,重新运行程序。一切ok!!!!

网络上的资料很多人提无法生成日志文件,是别的原因引起的,没发现大家提到这个configSections元素位置的问题。故记录下来,希望对需要的人有帮助。

猜你喜欢

转载自blog.csdn.net/sayesan/article/details/80423620