使用xml文件配置log4net

21

我尝试配置log4net,以便将所有内容记录到控制台输出。 我有一个名为Log4Net.config的配置文件。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="INFO" />
      <appender-ref ref="ConsoleAppender" />
    </root>
  </log4net>
</configuration>

我有一个主类(仅用于测试)

namespace TestLog4Net {
    class Program {
        private static readonly ILog log = LogManager.GetLogger(typeof(Program));

        static void Main(string[] args) {
            log.Info("Info");
            log.Error("Error");
            Console.ReadKey();
        }
    }
}

我将这些行添加到了AssemblyInfo.cs中。

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

但现在没有任何日志记录,有人能解释一下吗?


我遇到了完全相同的问题。我的实现方式类似,但仍然无法解决问题。你能帮我修复一下吗? - Karthikeyan
2
请确保在属性中将log4net.config文件标记为“复制到输出目录” -> “始终复制”。 - Amit
1
相关帖子 - Log4net xml输出 - RBT
3个回答

22

尝试通过代码使用这个自定义配置。对我有效,并在多个应用程序中进行了测试。

string logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "\\Config\\Log4Net.config");
    FileInfo finfo = new FileInfo(logFilePath);
   log4net.Config.XmlConfigurator.ConfigureAndWatch(finfo); 

我知道这是一个非常晚的回复,但对某些人来说会很有用。


22

当您在一个单独的配置文件中拥有log4net配置时,不应包含配置和configSections元素。 log4net应该是xml声明后的顶级元素。


尽管可能是正确的,但对于C#/.NET新手来说,这种解释过于简略了... - Gwyneth Llewelyn
还可以查看RBT的答案,对如何修复问题有更详细的解释。 - Gwyneth Llewelyn

4

我认为你在帖子中提到的文件是App.config文件的内容。 App.config是各种C#项目模板(如WinForm应用程序,控制台应用程序等)的默认配置文件。因此,您应该考虑将其命名为App.config而不是Log4Net.config

为了全面理解,让我们通过三种可能的方式来配置log4net:

如果我们想要使用应用程序的App.config文件来保存log4net的设置,那么我们需要在AssemlyInfo.cs文件中添加下面提到的声明到以下行:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
App.config将保存log4net设置如下:
在某些情况下,我们可能希望使用专用文件来保存log4net的设置。我们可以将其命名为log4net.config或log4net.xml。在创建这样一个专用配置文件时,我们需要确保log4net是配置文件的根标记(参考文件片段): 在这种情况下,我们需要在AssemblyInfo.cs文件中声明以下内容。同样的声明也在OP的问题中提到:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
现在是最终用例。假设我们有一个自定义的xml文件,例如myCustomSettings.xml,其中包含log4net设置。在这种情况下,log4net标记存在于自定义配置文件中,但它不是该文件的根标记(参考文件片段) 在这种情况下,我们需要在运行时通过C#代码配置log4net(参考代码片段)。 using System.Xml;
var configFilePath = "myCustomSettings.xml"; var log4netConfig = new XmlDocument(); log4netConfig.Load(File.OpenRead(configFilePath));
var repo = LogManager.CreateRepository(Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
var log4NetXml = log4netConfig["MyCustomSetting"]["log4net"]; log4net.Config.XmlConfigurator.Configure(repo, log4NetXml);
在这种情况下,我们不需要在AssemblyInfo.cs文件中进行声明式配置。因此,请确保您已将其从那里删除:
//TODO: Remove it [assembly: log4net.Config.Xml

非常好的回答!我很清楚这个问题已经老旧了,但似乎在十多年后,正确配置log4net仍然是一场噩梦。我知道这个问题古老了,而且提问者可能已经离开SO很久了,但你的答案应该被推广为正确的解决方案。 - Gwyneth Llewelyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接