Log4Net Error: Failed to find configuration section 'log4net' in the application's .config file
我目前使用一个类库来存储一个使用log4net处理日志的类。 此类在其他项目中使用。
我已经阅读了许多其他问题和答案,但还无法修复...
我启用了log4net的内部调试,因为它不会写入文件,这是我得到的错误:
1 | log4net:ERROR Failed to find configuration section 'log4net' in the application's .config file. Check your .config file for the <log4net> and <configSections> elements. The configuration section should look like: <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> |
这些是我的文件:
log4net.config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <log4net debug="true"> <param name="File" value="Logs/log4net.log" /> <param name="AppendToFile" value="true" /> <layout type="log4net.Layout.PatternLayout"> <param name="Header" value="[Header] " /> <param name="Footer" value="[Footer] " /> <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n" /> </layout> </appender> <root> <level value="ALL" /> </root> </log4net> |
App.config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> </configSections> </appSettings> <parameter> <parameterName value="@BlogId" /> <dbType value="Int32" /> <layout type="log4net.Layout.RawPropertyLayout"> <key value="BlogId" /> </layout> </parameter> </configuration> |
AssemblyInfo.cs(仅最后一行)
1 | [assembly: log4net.Config.XmlConfigurator(ConfigFile ="log4net.config", Watch = true)] |
Logger.cs
1 2 3 4 5 6 7 8 9 10 | public class Logger : ILogger { private static ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); public Logger() { XmlConfigurator.Configure(); logger.Info("NEW LOGGER INSTANCE CREATED"); } } |
更新
我通过使用Logger.cs的类为log4net提供了自己的.config文件来修复了它。 现在,log4net读取给定的.config文件,并且可以正常工作。
您已使用以下命令定义了log4net部分位于app.config中:
1 2 3 | <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> </configSections> |
这意味着您应该将log4net.config的内容添加到app.config文件中。
如果您尝试通过log4net实现包装器,而log4net驻留在其自己的类库中,而不在应用程序的主要可执行文件中,请在包装器类的静态构造函数中尝试以下操作:
1 2 3 4 5 6 7 | static Logger() { log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo (System.IO.Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly().Location))); } |
静态构造函数解决方案可确保如果您加载类库,则配置代码将运行。
您还需要执行一些操作,以将log4net.config文件从该类库项目复制到与可执行文件相同的文件夹中。您可以在部署应用程序时手动执行此操作。但是,在调试带有以下内容的后生成步骤时(从类库项目中)自动执行此操作会将配置文件放入正确的文件夹中:
1 2 3 4 5 6 | XCOPY"$(TargetDir)*.config"".\..\..\..\..\bin\Debug" /S /Y /I XCOPY"$(TargetDir)*.config"".\..\..\..\..\bin elease" /S /Y /I // Where those paths point to the main executable /bin folders // and build configuration target dirs |
使用这种方法的一个很好的理由是,如果您利用MEF之类的东西,则可以将logger包装器类作为接口引入,而无需在解决方案中的多个项目中引用log4net。您可以使用自己选择的抽象接口与记录器接口,并使用log4net作为Impl。 (桥模式)
祝好运!