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

Rob*_*ner 88 configuration logging log4net file external

我们正在使用log4net并希望在外部配置文件中指定它的配置(正如我们对其他部分所做的那样).为此,我们将App.config中的log4net部分更改为:

...
<section name="log4net" 
     type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
...
<log4net configSource="Log.config" />
...
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

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

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

Mit*_*eat 111

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

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
Run Code Online (Sandbox Code Playgroud)

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

private static readonly ILog log = 
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Run Code Online (Sandbox Code Playgroud)

我有一个包含此和其他信息博客文章在这里.

  • 这有效,请确保您创建log4net.config文件以在"始终复制"上设置"复制到输出目录"属性. (16认同)

Pre*_*ous 36

这个问题存在缺陷.Log4Net不支持配置元素的configSource属性.要使用纯配置文件解决方案,请使用appSettings中的log4net.Config键.

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

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
Run Code Online (Sandbox Code Playgroud)

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

<appSettings>
      <add key="log4net.Config" value="log4net.simple.config" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)

第3步:提供补丁以修复configSource的处理.

  • 对log4net.Config.XmlConfigurator.Configure()的调用; 应该通过它不读取configSource来解决这个问题 (5认同)
  • 将log4net配置文件标记为"如果更新则复制"非常重要.如果配置文件没有复制到bin文件夹,那么它将无法工作. (4认同)

Gre*_*jan 25

错过的步骤是

log4net.Config.XmlConfigurator.Configure(); 
Run Code Online (Sandbox Code Playgroud)

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

  • @Robert:当然,虽然Mitch Wheat的解决方案需要在app.config之外对配置文件进行硬编码 - 我读到原来的问题是为什么configSource没有工作,如果遵循这个额外的步骤,它确实有效. (4认同)

小智 19

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

构建行动:内容

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


小智 10

使用,

<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<appSettings>
<add key="log4net.Config" value="Log4Net.config" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)

要不就,

log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("Log4Net.config"));
Run Code Online (Sandbox Code Playgroud)

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