【问题标题】:Log4net rolling daily filename with date in the file nameLog4net 滚动每日文件名,文件名中包含日期
【发布时间】:2010-11-12 23:58:56
【问题描述】:

我想将文件命名为例如:

dd.mm.yyyy.log

log4net 怎么可能?

【问题讨论】:

标签: c# logging log4net filenames


【解决方案1】:
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
  <file value="logs\" />
  <datePattern value="dd.MM.yyyy'.log'" />
  <staticLogFileName value="false" />
  <appendToFile value="true" />
  <rollingStyle value="Composite" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="5MB" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  </layout>
</appender>

【讨论】:

  • 我认为你应该像@Mun 那样强调解决问题的参数的要点。不过,我也对你的回答投了赞成票。
  • 对我有用的是 datePattern 元素和 staticLogFileName 元素(并注意 file 元素的 value 属性)
  • 完整答案!
【解决方案2】:

在您的 Log4net 配置文件中,将以下参数与 RollingFileAppender 一起使用:

<param name="DatePattern" value="dd.MM.yyyy'.log'" />

【讨论】:

  • 看来这已被提升为配置元素: 干杯!
  • @mstaessen &lt;preserveLogFileNameExtension value="true" /&gt; 是正确的语法,这是一个很好的答案。请问损失是怎么发生的?
  • 如果我没记错的话,它是这样的。在启动时,log4net 将生成滚动序列中的第一个文件名。它会检测到该文件已经存在,然后决定滚动到第二个文件,但是当那个文件也已经存在时,它不会决定滚动,而是清除它并覆盖第二个日志文件中的所有内容。在您需要清除时间范围的日志之前,它完全被忽视了......
【解决方案3】:

对于 RollingLogFileAppender,您还需要这些元素和值:

<rollingStyle value="Date" />
<staticLogFileName value="false" />

【讨论】:

  • 这可行,但会在文件扩展名之后附加日期。例如,我得到像 Error.log20111104 这样的日志文件 - 有谁知道更好地格式化文件名的方法?
  • 以下是如何更好地格式化文件名:stackoverflow.com/questions/615092/…
  • staticLogFileName 是做什么用的?我只希望在一天结束后将日志文件转换为新名称。我想使用一个日志监视器,每次都查看一个特定的。
【解决方案4】:

我最终使用了(注意“.log”文件名和“myfilename_”周围的单引号):

  <rollingStyle value="Date" />
  <datePattern value="'myfilename_'yyyy-MM-dd"/>
  <preserveLogFileNameExtension value="true" />
  <staticLogFileName value="false" />
  <file type="log4net.Util.PatternString" value="c:\\Logs\\.log" />

这给了我:

myfilename_2015-09-22.log
myfilename_2015-09-23.log
.
.

【讨论】:

  • preserveLogFileNameExtension 不适用于较早版本的 log4net(例如 v1.2.10),因为它被描述为 here
【解决方案5】:

使用 Log4Net 1.2.13,我们使用以下配置设置来允许文件名中包含日期时间。

&lt;file type="log4net.Util.PatternString" value="E:/logname-%utcdate{yyyy-MM-dd}.txt" /&gt;

它将按照以下约定提供文件:logname-2015-04-17.txt

有了这个,通常最好有以下内容,以确保您每天持有 1 个日志。

<rollingStyle value="Date" />
<datePattern value="yyyyMMdd" />

如果文件大小是一个问题,以下允许 500 个大小为 5MB 的文件,直到新的一天产生。 CountDirection 允许对不再是当前的文件进行升序或降序编号。

 <maxSizeRollBackups value="500" />
 <maximumFileSize value="5MB" />
 <rollingStyle value="Composite" />
 <datePattern value="yyyyMMdd" />
 <CountDirection value="1"/>
 <staticLogFileName value="true" />

【讨论】:

    【解决方案6】:

    我已经尝试了所有答案,但总是缺少一些东西,并且无法按预期运行。

    然后我对每个答案中给出的提示进行了一些实验,并通过以下设置成功:

    <appender name="RollingActivityLog" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="C:\temp\LOG4NET_Sample_Activity.log" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <preserveLogFileNameExtension value="true" />
      <datePattern value="-yyyyMMdd" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %-5level - %message%newline" />
      </layout>
    </appender>
    

    其他参数组合的问题是最新文件没有时间模式,或者时间模式被附加为 .log20171215 这创建了一个新文件时间(以及每天都有新的文件类型!) - 或者两个问题都出现了。

    现在使用此设置,您将获得类似这样的文件:

    LOG4NET_Sample_Activity-20171215.log

    这正是我想要的。


    总结一下:

    • 不要将日期模式放在&lt;file value=...属性中,只需在datePattern中定义即可。

    • 确保您已将preserveLogFileNameExtension value 属性设置为true

    • 确保将staticLogFileName 设置为false

    • rollingStyle属性设置为Date

    【讨论】:

    • 您还可以将 rollingStyle 设置为 Composite,即按日期和大小滚动。
    • 效果很好。我还要在总结中添加:确保将 staticLogFileName 值设置为 false
    【解决方案7】:

    要保留文件扩展名:

    <log4net>
        <root>
          <level value="DEBUG"/>
          <appender-ref ref="RollingLogFileAppender"/>
        </root>
        <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
          <file type="log4net.Util.PatternString" value="D:\\LogFolder\\%date{yyyyMM}\\SchT.log" />
          <appendToFile value="true" />
          <rollingStyle value="Date" />
          <maximumFileSize value="30MB" />
          <staticLogFileName value="true" />
          <preserveLogFileNameExtension value="true"/>
          <datePattern value="ddMMyyyy" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
          </layout>
        </appender>
      </log4net>
    

    【讨论】:

    • 为什么会有%date{yyyyMM}value="ddMMyyyy" ?什么是生效日期模式?
    • 我认为 datePattern 用于文件名,但 %date{yyyyMM} 用于父目录(我希望这样)
    • datePattern 属性设置日期滚动样式的滚动周期。请参阅 RollingFileAppender 下的 logging.apache.org/log4net/release/config-examples.html。 “例如,“yyyyMMdd”的日期模式将每天滚动。有关可用模式的列表,请参阅 System.Globalization.DateTimeFormatInfo。”
    • @rbuddicom 是的,但问题是关于如何保留文件扩展名。
    • 我知道,Allan 质疑 'value="ddMMyyyy"' 的目的。您的评论“我认为 datePattern 用于文件名”在这方面是不正确的。
    【解决方案8】:

    上一个响应中的扩展配置部分

     ...
     ...
     <rollingStyle value="Composite" />
     ...
     ...
    

    列出的作品,但我不必使用

    <staticLogFileName value="false" /> 
    

    。我认为 RollingAppender 必须(逻辑上)忽略该设置,因为根据定义,文件每天都会在应用程序重新启动/重用时重建。也许每次应用程序启动时立即翻转确实很重要。

    【讨论】:

    • 对我来说,没有
    • 我也是,必须将 staticLogFileName 设置为 false 否则它不会记录
    【解决方案9】:

    我将配置移至代码,以便使用系统变量从 CI 轻松修改。我将此代码用于文件名,结果是'Log_03-23-2020.log'

                log4net.Repository.ILoggerRepository repository = LogManager.GetRepository(Assembly.GetEntryAssembly());
                Hierarchy hierarchy = (Hierarchy)repository;
                PatternLayout patternLayout = new PatternLayout();
                patternLayout.ConversionPattern = "%date %level - %message%newline%exception";
                patternLayout.ActivateOptions();
    
                RollingFileAppender roller = new RollingFileAppender();
                roller.AppendToFile = true;
                roller.File = "Log_";
                roller.DatePattern = "MM-dd-yyyy'.log'";
                roller.Layout = patternLayout;
                roller.MaxFileSize = 1024*1024*10;
                roller.MaxSizeRollBackups = 10;
                roller.StaticLogFileName = false;
                roller.RollingStyle = RollingFileAppender.RollingMode.Composite;
                roller.ActivateOptions();
                hierarchy.Root.AddAppender(roller);
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      相关资源
      最近更新 更多