为什么log4net在配置之前会创建一个空的日志文件?

时间:2015-04-10 02:19:37

标签: c# log4net app-config

由于某种原因,我的log4net在我的调试/发布文件夹中创建了一个空日志文件。示例文件名为"(null)20150409.txt"。

我不知道如何告诉它不要这样做。我正在以编程方式配置log4net,但是这个空文件是在实际运行配置例程之前创建的,可能是App.config文件本身的结果。

这是App.config文件:

<?xml version="1.0"?>
    <configuration>

  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
  </configSections>

  <log4net>
    <root>
      <level value="ALL"/>
      <appender-ref ref="LogFileAppender"/>
    </root>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender, log4net">
      <!--http://logging.apache.org/log4net/release/config-examples.html-->
      <!--http://logging.apache.org/log4net/release/faq.html-->

      <!--<param name="File" value="C:\Images\log-file.txt" />-->
      <file type="log4net.Util.PatternString" value="%property{LogFileName}"/>

      <staticLogFileName value="false"/>
      <param name="AppendToFile" value="true"/>
      <rollingStyle value="Date"/>
      <datePattern value="' 'yyyyMMdd'.txt'"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
      </layout>
    </appender>
  </log4net>

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  </startup>

</configuration>

这是C#配置代码(似乎工作正常):

log4net.GlobalContext.Properties["LogFileName"] = LogFileName;  
// Full path to log file
log4net.Config.XmlConfigurator.Configure();
Log.Debug("CV3 Launched with log file located here: " + LogFileName);

如何在不影响正常工作的其余日志记录的情况下阻止创建此空文件?

2 个答案:

答案 0 :(得分:2)

我有同样的问题。围绕(hereherehere)进行研究,错误是因为您在设置log4net属性之前调用了log4net.Config.XmlConfigurator.Configure();

如果您和我一样,很可能您在文件AssemblyInfo.cs已配置log4net 。因为AssemblyInfo中的记录器将首先被加载,所以每次你的应用程序启动时它都会创建另一个(null)文件。

希望它有所帮助。

答案 1 :(得分:0)

@ nb1forxp,你试过这种方式吗?

创建新的锁定模型

public class MyLock : log4net.Appender.FileAppender.MinimalLock
{
      public override Stream AcquireLock()
      {
            if (CurrentAppender.Threshold == log4net.Core.Level.Off)
                  return null;

            return base.AcquireLock();
      }
}

<强>配置

<threshold value="OFF" />
<lockingModel type="Namespace.MyLock" />

参考How to disable creation of empty log file on app start?