【问题标题】:why log4net config file is not being read为什么没有读取 log4net 配置文件
【发布时间】:2017-01-11 18:27:16
【问题描述】:

我的解决方案的根目录中有一个文件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);

我也将log4net.Config.XmlConfigurator.Configure();(以及FileInfo 参数)添加到主Program.cs

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

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

类似帖子:

提前致谢。

编辑

所以我通过从文档中删除复制/粘贴的部分来在 VS 中工作:

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

但是,从 exe 运行仍然不起作用

【问题讨论】:

  • 路径可能有问题 - 您在配置中有“Logs\\log.log”,它可能应该是“Logs\log.log” - 无需转义 \在配置文件值中。
  • 权限也可以发挥作用——运行程序的用户需要创建文件和写入权限才能成功登录文件
  • 您的附加程序名称是 RollingFile,而您在 root 标记中将其引用为 A1。他们应该匹配。请参考这篇相关帖子 - Configuring log4net with xml file

标签: c# log4net


【解决方案1】:

调试 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>

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢,我确实找到了答案,而且看起来 log4net 很聪明,可以忽略双 \ - 当 root 配置正确时,两者实际上都可以工作
    【解决方案3】:

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

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

    其次,我只需将两个附加程序都添加到根标签:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-10
        • 2021-10-15
        • 2017-11-03
        • 2017-07-21
        • 1970-01-01
        • 2017-10-06
        • 2010-12-24
        • 2020-06-09
        相关资源
        最近更新 更多