外部文件中的log4Netconfiguration不起作用

我们正在使用log4net,并且想要在外部configuration文件中指定它的configuration(正如我们已经对其他部分所做的那样)。 为此,我们将App.config中的log4net部分更改为:

... <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> ... <log4net configSource="Log.config" /> ... 

在Log.Config文件(与App.config相同的目录)中,我们有:

 <log4net> <appender name="General" type="log4net.Appender.FileAppender"> <file value="log.txt" /> <layout type="log4net.Layout.SimplyLayout" /> </appender> <root> <appender-ref ref="General" /> </root> </log4net> 

但是,当我们运行应用程序,没有创build日志文件(并没有logging完成)。 没有错误消息输出到控制台。

如果我们将Log.config文件的内容移回App.config(replace上面的第一个代码行),它将按预期工作。 任何想法,为什么它不在外部文件中工作?

你的AssemblyInfo.cs文件中有以下属性:

 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)] 

并在每个需要日志loggingfunction的课程开始时这样的代码:

 private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

我有一个博客文章,其中包含这个和其他信息。

这个问题有一个公开的缺陷 。 Log4Net不支持configuration元素的configSource属性。 要使用纯粹的configuration文件解决scheme,请在appSettings中使用log4net.Config键。

步骤1:包含正常的configuration部分定义:

 <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> 

第2步:在appSettings中使用神奇的log4net.Config键。

 <appSettings> <add key="log4net.Config" value="log4net.simple.config" /> </appSettings> 

第3步:提供补丁来修复configSource的处理。

已经错过的步骤是

 log4net.Config.XmlConfigurator.Configure(); 

这将导致使用configSource。 确保在调用GetLogger()之前调用它一次;

确保您的log4net.config文件设置了以下属性:

构build行动:内容

复制到输出目录:复制总是

无论是使用,

 <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <appSettings> <add key="log4net.Config" value="Log4Net.config" /> </appSettings> 

要不就,

 log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("Log4Net.config")); 

在这两种情况下,文件Log4Net.config都应该在输出目录中。 您可以通过在解决scheme资源pipe理器中设置Log4Net.config文件属性来执行此操作。 构build操作 – 内容并复制到输出目录 – 始终复制

假设你有一个名为log4net.config的外部configuration文件被复制到你的deploy目录,你可以这样configuration它:

 using System; using System.Collections.Generic; using System.Windows.Forms; using System.Reflection; using log4net; namespace MyAppNamespace { static class Program { //declare it as static and public so all classes in the project can access it //like so: Program.log.Error("got an error"); public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program)); /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { //configure it to use external file log4net.Config.XmlConfigurator.Configure(new Uri(Application.StartupPath + "\\log4net.config")); //use it log.Debug("############# STARING APPLICATION #################"); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormMain()); } } } 

小心这个问题…

在我的情况下,一切正确configuration。 问题是我使用Visual Studio 2013中的Web Deploy将站点上载到WinHost.com ,并重置了服务器上的ACL 。 这又取消了文件夹和文件的所有权限–log4net无法写入文件。

你可以在这里读更多关于它的内容:

如何停止Web Deploy / MSBuild搞乱服务器权限

我问那里的支持团队重置ACL,然后log4net开始分发日志。 🙂

@Mitch,事实certificate有一个文件与[assembly:…]声明,但它没有ConfigFile属性。

一旦我添加它并将其指向Log.config,它开始工作。 我会认为它会像所有其他configuration部分(即AppSettings),并接受外部configuration文件没有修改。

我们没有提到第二种说法,因为我们将它包装在全局静态日志提供程序中。

我有同样的问题,除了有

 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net")] 

在正在运行的项目中,我也在参考项目中有以下行:

 [assembly: log4net.Config.XmlConfigurator] 

当我在被引用的项目中删除这一行时,日志开始出现。

也可以打开log4net的debugging模式。 将其插入到App.config文件中:

  <appSettings> <add key="log4net.Internal.Debug" value="true"/> </appSettings> <system.diagnostics> <trace autoflush="true"> <listeners> <add name="textWriterTraceListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="link\to\your\file.log" /> </listeners> </trace> </system.diagnostics> 

而且你至less会得到错误信息,从中你可以得出究竟是哪里出了问题。 在我的情况下,我忘了将Copy to output directory设置为Copy Always