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

时间:2017-01-11 18:27:17

标签: c# log4net

我的解决方案根目录中有一个文件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运行仍然无法正常工作

4 个答案:

答案 0 :(得分:3)

最简单的方法是调试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>

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

首先,由于uint32_t g_ADCValue; int g_MeasurementNumber; int main(void) { HAL_Init(); SystemClock_Config(); ConfigureADC(); HAL_ADC_Start(&g_AdcHandle); for (;;) { if (HAL_ADC_PollForConversion(&g_AdcHandle, 1000000) == HAL_OK) { g_ADCValue = HAL_ADC_GetValue(&g_AdcHandle); g_MeasurementNumber++; } } } 中有文件声明,因此不需要AssemblyInfo.cs

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

log4net.Config.XmlConfigurator.Configure();

就是这样。控制台上的VS输出以及文件和exe输出到文件。

答案 3 :(得分: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"]);