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

5
我在我的解决方案根目录下有一个名为log4net.xml的文件。将该文件复制到bin目录的属性设置为始终复制。我已确认该文件已经复制到了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);

我将 log4net.Config.XmlConfigurator.Configure(); (也可加入 FileInfo 参数)添加到主要的 Program.cs 中。
然而,如果我运行程序,期望生成的日志文件并未创建。我怀疑log4net甚至没有读取配置文件。
我有什么遗漏吗?从VS中执行也不起作用(尽管它会从控制台附加程序中读取一些东西)。
类似的帖子: 提前感谢。 编辑 因此,我通过从文档中删除复制/粘贴的部分使其在VS中工作:
 <root>
  <level value="DEBUG" />
  <appender-ref ref="A1" />
 </root>

然而,从exe运行仍然无法正常工作。

1
可能是路径的问题 - 在配置文件中你写成了"Logs\log.log",应该改为"Logs\log.log" - 配置文件的值不需要转义\。 - Tim
权限也可能发挥作用——运行程序的用户需要具有创建文件和写入访问权限,才能成功记录到文件中。 - dbugger
您的appender名称为RollingFile,但在root标签中引用为A1。它们应该匹配。请参考此相关帖子 - 使用xml文件配置log4net - RBT
4个回答

4
最简单的调试log4net错误的方法是将它们转储到C:\tmp\log4net.txt文件中。这不会回答您原来的问题,但会给您一个线索去寻找答案。 如何启用log4net内部调试?
<?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>

0

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

尝试将配置文件中的文件值更改为一个反斜杠,像这样:

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

谢谢,我已经找到答案了,看起来log4net足够聪明,可以忽略双反斜杠 - 当“root”正确配置时,两者都可以正常工作。 - Manish Patel

0

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

首先,由于在AssemblyInfo.cs中声明了该文件,因此无需使用log4net.Config.XmlConfigurator.Configure();

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

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

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


0

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

      // 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"]);

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