Log4net每日滚动文件名中包含日期

135

我希望文件能够以如下格式命名:

dd.mm.yyyy.log

请问log4net如何实现该功能?


可能是Log4net appender文件名问题的重复。 - Narottam Goyal
11个回答

232
<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>

2
我认为你应该像@Mun一样突出解决问题的参数的主要点。不过,我也投了你的答案。 - NoName
2
是datePattern元素与staticLogFileName元素(请注意file元素的value属性)结合使用对我起了作用。 - Michhes
1
完整的答案! - Nagesh

113
在您的Log4net配置文件中,使用以下参数与RollingFileAppender一起使用:
<param name="DatePattern" value="dd.MM.yyyy'.log'" />

30
看起来这已经被提升为一个配置元素:<datePattern value="dd.MM.yyyy'.log'" /> 干杯! - longda
4
“@mstaessen <preserveLogFileNameExtension value="true" />”是正确的语法,这是一个好的答案。我可以问一下为什么会出现损失吗? - Larry Beasley
1
如果我没记错的话,log4net在启动时会生成滚动序列中的第一个文件名。它会检测到该文件已经存在,然后决定滚动到第二个文件,但当第二个文件也已经存在时,它不会决定滚动到下一个文件,而是清除并覆盖第二个日志文件中的所有内容。这会完全不被注意,直到您需要那段时间内的日志记录... - mstaessen

33

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

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

3
这个方法可以用,但是在文件扩展名后面附加了日期。例如,我会得到像Error.log20111104这样的日志文件。请问是否有更好的文件命名格式? - LostNomad311
这是如何更好地格式化文件名的方法:https://dev59.com/R3RB5IYBdhLWcg3weHHx#615137 - LostNomad311
staticLogFileName 用于什么?我只想在一天结束后将日志文件滚动到一个新名称。我想使用一个日志监视器,每次查看特定的日志文件。 - Sun

27

最终我使用了(请注意'.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)无效,如此处所述:[https://dev59.com/kIXca4cB1Zd3GeqPMrtc]。 - Dmitry Karpenko

24

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

<file type="log4net.Util.PatternString" value="E:/logname-%utcdate{yyyy-MM-dd}.txt" />

这将提供以下格式的文件:logname-2015-04-17.txt

通常最好使用以下设置以确保每天只保存一个日志文件。

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

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

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

19

我尝试了所有答案,但总是感觉缺少某些东西,并且不能按照我的预期运行。

后来,我在每个答案中给出的提示进行了一些实验,最终成功地使用了以下设置:

<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

这就是我想要的。


总结一下:

  • 不要将日期模式放在<file value=...属性中,只需在datePattern中定义它。

  • 确保将preserveLogFileNameExtensionvalue属性设置为true

  • 确保将staticLogFileNamevalue设置为false

  • rollingStyle属性的value设置为Date


您还可以将rollingStyle设置为Composite,这样它就可以按日期和大小进行滚动。 - Simon Elms
1
运行良好。我还会加入总结:确保staticLogFileName值设置为false。 - Randall Flagg

6
保留文件扩展名:
<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"?哪一个是有效的日期格式? - Allan Ruin
我认为datePattern是用于文件名的,但%date{yyyyMM}是用于父目录的(我希望是这样的)。 - Fourat
datePattern 属性设置了日期滚动样式 Date rollingStyle 的滚动周期。请参阅 RollingFileAppender 下的 https://logging.apache.org/log4net/release/config-examples.html。"例如,日期模式为“yyyyMMdd”的将每天滚动一次。请参阅 System.Globalization.DateTimeFormatInfo 以获取可用模式列表。" - Ryan Buddicom
我知道,艾伦质疑了'value="ddMMyyyy"'的目的。你的评论“我认为datePattern是用于文件名”的说法是不正确的。 - Ryan Buddicom
@Fourat 好的,没问题 :) - Ryan Buddicom
显示剩余2条评论

0

在之前的响应中,扩展配置部分为

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

列出了作品,但我没有使用过

<staticLogFileName value="false" /> 

我认为RollingAppender必须(逻辑上)忽略该设置,因为按定义,每天应用程序重新启动/重用时文件都会被重建。也许对于每次应用程序启动的立即滚动记录,这确实很重要。


对我来说,如果没有 <staticLogFileName value="false" />,它就无法正常工作。 - nurettin
我也是,不得不将 staticLogFileName 设置为 false,否则它就不会记录日志。 - oonyalo

0

你的答案是将“rollingStyle value”更改为“Date”。其他方面看起来都很好。

<rollingStyle value="Date" />

诀窍在于隐藏这四个定义:

 ...
  <file value="logs\" />
  <datePattern value="dd.MM.yyyy'.log'" />
  <staticLogFileName value="false" />
  <rollingStyle value="Date" />
  ...

这是我的log4net配置:

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!-- Log4Net -->
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    </configSections>
    <log4net>
        <root>
            <level value="ALL" />
            <appender-ref ref="RollingFileAppender" />
        </root>
        <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
            <file value="logs\log_" />
            <rollingStyle value="Date" />
            <datePattern value="yyyy_MM_dd'.txt'"/>
            <staticLogFileName value="false" />
            <appendToFile value="true" />
            <maxSizeRollBackups value="50" />
            <maximumFileSize value="10MB" />
            <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %level - %message%newline%exception" />
            </layout>
            <filter type="log4net.Filter.LevelRangeFilter">
                <levelMin value="INFO" />
                <levelMax value="ERROR" />
                <levelMin value="DEBUG" />
            </filter>
        </appender>
    </log4net>
    <!-- Log4Net -->
</configuration>

0
对于我来说,解决方案是修改datePattern值,例如:
<datePattern value="'-'yyyy-MM-dd'.log'" />

这是我的追加器:

<appender name="testAppender" type="log4net.Appender.RollingFileAppender">
<file  type="log4net.Util.PatternString" value="ApplicationLog" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<staticLogFileName value="false" />
<preserveLogFileNameExtension value="true" />
<datePattern value="'-'yyyy-MM-dd'.log'" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100MB" />
<layout type="log4net.Layout.PatternLayout">
  <conversionPattern value="%date %-5level - %message%newline" />
</layout>

我的日志文件将被命名为:ApplicationLog-2022-11-04.log


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接