【问题标题】:Log4net sometimes creating two logs, one emptyLog4net 有时会创建两份日志,一份为空
【发布时间】:2015-03-09 15:56:51
【问题描述】:

使用下面的配置,大约有一半的时间,我得到一个两个日志,一个是空的。它们的文件名相差一秒(log.2015-03-09_11-50-25 vs log.2015-03-09_11-50-26)

我正在尝试每次运行控制台应用程序都有一个日志。

<log4net>

  <appender name="Log" type="log4net.Appender.FileAppender">
    <file type="log4net.Util.PatternString" value="C:\env\QA\Logs\consoleapp\log.%date{yyyy-MM-dd_HH-mm-ss}.txt"/>
    <appendToFile value="true"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date    %message%newline"/>
    </layout>
  </appender>

  <root>
    <level value="INFO"/>
    <appender-ref ref="Log"/>
  </root>
</log4net>

后一个日志是唯一被填充/写入的日志。

为什么会这样?我该如何解决?

编辑:原来我在我的代码中实例化了第二个记录器。当实例化发生在另一秒时,会创建第二个日志。 appender 工作正常。

【问题讨论】:

  • 删除文件名中的第二个说明符。
  • 您的方法可能不是最理想的。尝试使用用户名/pid/其他在足够小的时间段内唯一的东西作为日志文件命名的“主键”
  • @swe 时间戳适用于日志文件名称 - 允许轻松读取文件名并将它们放在上下文中。
  • 原来我在我的代码中实例化了第二个记录器。当实例化发生在另一秒时,会创建第二个日志。 appender 工作正常。

标签: c# log4net log4net-appender fileappender


【解决方案1】:

我以前见过类似的东西 - 这是由于在文件名中指定了第二个,并且写入发生在一秒结束和另一秒开始期间。

<file type="log4net.Util.PatternString" value="C:\env\QA\Logs\consoleapp\log.%date{yyyy-MM-dd_HH-mm-ss}.txt"/>

应该是

<file type="log4net.Util.PatternString" value="C:\env\QA\Logs\consoleapp\log.%date{yyyy-MM-dd}.txt"/>

在我的上一份工作中,有人在日志文件名中设置了第二个说明符,生产服务器在尝试渲染日志文件夹中包含的 150,000 个文件时差点崩溃。

编辑:

如果您想每次运行编写一次,您可以将以下内容添加到您的 log4net 配置中:

<rollingStyle value="Once" />

而您可能需要将appendToFile 属性设置为false。

log4net one file per run

所以你的配置应该是这样的:

<appender name="Log" type="log4net.Appender.FileAppender">
    <file type="log4net.Util.PatternString" value="C:\env\QA\Logs\consoleapp\log.%date{yyyy-MM-dd_HH-mm-ss}.txt"/>
    <appendToFile value="false" />    
    <maxSizeRollBackups value="-1" /> <!--infinite-->
    <rollingStyle value="Once" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date    %message%newline"/>
    </layout>
  </appender>

【讨论】:

  • 我不想覆盖或附加到以前的日志。我希望每次运行都有一个单独的文件。如果日志在同一天,您的建议会附加到日志。
  • 和我原来的帖子一样的问题,但是注意到当第二个文件在同一秒时,它仍然会创建两个,一个在文件名后面附加一个“.1”
【解决方案2】:

我使用了 user1666620 的解决方案,但仍然得到一个 .log.1 文件。 原来我的 AssemblyInfo.cs 文件中有以下行:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

删除以上行解决了我的问题。顺便说一句,我的 program.cs 看起来像:

public static class Program
{
    static Program()
    {
        // Initialize logging
        log4net.Config.XmlConfigurator.Configure();
    }

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

    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多