【问题标题】:Log4net creates new file with old dateLog4net 使用旧日期创建新文件
【发布时间】:2018-05-13 08:15:24
【问题描述】:

我实现了可以作为 Windows 服务运行的控制台应用程序(非常类似于.NET console application as Windows service)。

  • .NET 框架 4
  • log4net 2.0.8

这是 log4net 配置:

<?xml version="1.0" encoding="utf-8" ?>
<log4net>

  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Log\App_%date{yyyy-MM-dd}.log" type="log4net.Util.PatternString" />
    <appendToFile value="true" />
    <param name="maxSizeRollBackups" value="5" />
    <rollingStyle value="Composite" />
    <datePattern value="yyyy-MM-dd" />
    <filter type="log4net.Filter.LevelRangeFilter">
      <acceptOnMatch value="true" />
    </filter>
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%-3thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>

  <root>
    <level value="ALL" />
    <appender-ref ref="RollingLogFileAppender" />
  </root>
</log4net>

Main(string[] args) 的第一行是 log4net 初始化:

XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));

Logger 在Program 类的顶部初始化,如下所示:

private static readonly ILog _log = LogManager.GetLogger(typeof(Program));

当服务启动/重新启动或手动运行控制台应用程序时,会使用正确的文件名创建日志文件,例如App_2017-11-29.log。但是,如果我让 Windows 服务在夜间运行,则会在午夜创建具有初始日期的新文件,并将旧文件附加到昨天的日期。例如,如果我今天开始服务,并让它运行 3 天,这将在日志文件中

  • App_2017-11-29.log(当前日志文件)
  • App_2017-11-29.log2017-12-01
  • App_2017-11-29.log2017-11-30
  • App_2017-11-29.log2017-11-29

知道为什么会这样吗?

【问题讨论】:

    标签: c# .net windows-services log4net


    【解决方案1】:

    &lt;file value="" /&gt; 元素确定“基本”文件名,并在应用程序启动时确定一次,之后附加&lt;datePattern value="" /&gt;,并以指定格式替换为当前日期。

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

    <rollingStyle value="Composite" />
    <file value="Log\App_" type="log4net.Util.PatternString" />
    <datePattern value="yyyy-MM-dd'.log'" />
    <staticLogFileName value="false" />
    

    【讨论】:

    • 这说明了很多!还有为什么在 Web 应用程序中有时它可以正常工作,有时不能(池回收)。会试一试并接受您的回答!
    • 好的,我试过了,但是得到“App_”文件名,没有日期模式?
    • 所以事实证明我还必须像这样将 staticLogFileName 设置为 false: 现在它可以工作了,你可能知道为什么吗? (文档说总是写入同一个文件是正确的,但如果是这样的话,总是只有 1 个文件)
    • 是的,你是对的。我现在不知道为什么,但你需要 staticLogFileName 为 false 才能工作。
    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多