外部文件中的Log4Net配置不起作用

时间:2009-01-15 08:00:59

标签: file logging configuration log4net external

我们正在使用log4net并希望在外部配置文件中指定它的配置(正如我们对其他部分所做的那样)。为此,我们将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="myapp.log" />
    <layout type="log4net.Layout.SimpleLayout" />
  </appender>
  <root>
    <appender-ref ref="General" />
  </root>
</log4net>

但是,当我们运行应用程序时,不会创建任何日志文件(并且没有完成日志记录)。没有错误消息输出到控制台。

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

13 个答案:

答案 0 :(得分:110)

您的AssemblyInfo.cs文件中是否包含以下属性:

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

在每个需要日志记录功能的类的开头都有这样的代码:

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

我有一篇博客文章,其中包含此信息和其他信息here

答案 1 :(得分:36)

此问题有open defect。 Log4Net不支持配置元素的configSource属性。要使用纯配置文件解决方案,请使用appSettings中的log4net.Config键。

步骤1:包括正常配置部分定义:

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

步骤2:在appSettings中使用magic log4net.Config键。

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

步骤3:提供修补程序以修复configSource的处理。

答案 2 :(得分:24)

错过的步骤是

log4net.Config.XmlConfigurator.Configure(); 

这将导致使用configSource。 在调用GetLogger();

之前,请确保调用一次

答案 3 :(得分:19)

确保使用以下属性设置log4net.config文件:

构建操作:内容

复制到输出目录:始终复制

答案 4 :(得分:9)

使用,

<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都应该在输出目录中。 您可以通过在解决方案资源管理器中设置Log4Net.config文件属性来执行此操作。 构建操作 - 内容和复制到输出目录 - 始终复制

答案 5 :(得分:2)

注意这个问题...

在我的情况下,一切都配置正确。问题是我在Visual Studio 2013中使用Web Deploy将站点上传到WinHost.com并重置服务器上的ACLs。这反过来又撤销了对文件夹和文件的所有权限 - log4net无法写入文件。

您可以在此处详细了解:

How to stop Web Deploy/MSBuild from messing up server permissions

我要求那里的支持团队重置ACL,然后log4net开始吐出日志。 :)

答案 6 :(得分:1)

假设您有一个名为log4net.config的外部配置文件,该文件被复制到您的部署目录,您可以这样配置它:

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());
        }
    }
}

答案 7 :(得分:1)

我有同样的问题,除了

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

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

[assembly: log4net.Config.XmlConfigurator]

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

答案 8 :(得分:1)

也可以打开doInBackground & doInBackground & doInBackground & doInBackground & wait 的调试模式。将其插入App.config文件:

log4net

并且您至少会收到错误消息,您可以从中获取确实出错的内容。在我的情况下,我只是忘了将 <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> 设置为Copy to output directory

答案 9 :(得分:0)

@Mitch,事实证明有一个带有[assembly:...]声明的文件,但它没有ConfigFile属性。

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

我们没有您提到的第二个声明,因为我们将它包装在全局静态日志提供程序中。

答案 10 :(得分:0)

在我的情况下,我收到此错误消息:

log4net: config file [C:\........\bin\Debug\log4net.config] not found.

log4net.config 该文件位于Visual Studio 2017项目中,但当我在 bin\Debug 文件夹中检查该文件时,我找不到它

我原来的装配设置是这样的:

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

经过一段研究时间后,我将其更改为以下内容并且有效:

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

答案 11 :(得分:0)

  1. 将以下内容添加到 AssemblyInfo.cs

[程序集:log4net.Config.XmlConfigurator(ConfigFile =“ Log4Net.config”)]

  1. 确保log4net.config包含在项目中
  2. 在log4net.config的属性中

复制到输出目录更改为如果更新则复制

  1. 仔细检查日志级别  级别值=“ ALL”

答案 12 :(得分:0)

还值得指出的是,在Web应用程序中,它查找的是根目录,而不是bin文件夹,因此请确保将其放在配置文件中。