为什么没有读取 log4net 配置文件

why log4net config file is not being read

我的解决方案的根目录中有一个文件 log4net.xml。用于复制到 bin 的文件 属性 设置为 Always copy。我已经确认文件复制到bin目录了。

在配置中我设置了一个文件附加器(基本上是文档中的复制粘贴):

<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
 <file value="Logs\log.log" />
 <appendToFile value="true" />
 <rollingStyle value="Date"/>
 <datePattern value="yyyyMMdd-HHmmss" />
 <layout type="log4net.Layout.PatternLayout">
  <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
 </layout>
</appender>

我在AssemblyInfo.cs

中也有这一行
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.xml", Watch = true)]

记录器在代码文件中是这样设置的:

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

我也在主 Program.cs 中添加了 log4net.Config.XmlConfigurator.Configure();(以及 FileInfo 参数)。

但是,如果我执行该程序,则不会创建预期的日志文件。我怀疑 log4net 甚至没有读取配置文件。

我错过了什么吗?从 VS 中执行也不起作用(尽管它以某种方式获取了 Console Appender 部分)。

类似的帖子:

提前致谢。

编辑

所以我通过从文档中删除 copy/pasted 部分来在 VS 中工作:

 <root>
  <level value="DEBUG" />
  <appender-ref ref="A1" />
 </root>

但是,来自 exe 的 运行 仍然不起作用

我认为问题可能出在配置文件路径中的双 \。鉴于当你 运行 Visual Studio 中的程序和 Console Appender 部分工作时,这似乎表明正在读取配置文件,它只是无法写入文件,因为路径是'有效。我对 Log4Net 不太熟悉,所以我不知道无效路径是否会抛出异常 - 它可能会被吞没。

尝试将配置中的文件值更改为一个反斜杠,如下所示:

<file value="Logs\log.log" />

最简单的调试 log4net 错误的方法是将它们转储到 C:\tmp\log4net.txt 下的文件中。 这不会回答您原来的问题,但会为您提供查找位置的线索。

How do I enable log4net internal debugging?

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
</configuration>

<configuration>
    ...

    <system.diagnostics>
        <trace autoflush="true">
            <listeners>
                <add 
                    name="textWriterTraceListener" 
                    type="System.Diagnostics.TextWriterTraceListener" 
                    initializeData="C:\tmp\log4net.txt" />
            </listeners>
        </trace>
    </system.diagnostics>

    ...
</configuration>

我解决了这个问题,我不知道它是否是正确的修复 - 我不知道为什么它在 VS 中工作一次 - 但我认为这只是配置文件配置不正确。

首先,由于AssemblyInfo.cs中有文件声明,所以不需要log4net.Config.XmlConfigurator.Configure();

其次,我只需将两个 appender 添加到根标签即可:

<root>
 <level value="DEBUG" />
 <appender-ref ref="A1" />
 <appender-ref ref="RollingFile" />
</root>

就是这样。 VS 输出到控制台和文件,exe 输出到文件。

对于控制台应用程序。我们可以使用以下代码进行配置

      // Path of your log4net config file
      string  configFilePath = @"/log4net.config";

        XmlDocument log4netConfig = new XmlDocument();
        log4netConfig.Load(File.OpenRead(configFilePath));

        var repo = LogManager.CreateRepository(
            Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));

        log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);