log4j2 RollingFile Appender 需要日期模式

Posted

技术标签:

【中文标题】log4j2 RollingFile Appender 需要日期模式【英文标题】:log4j2 RollingFile Appender requires date pattern 【发布时间】:2013-12-17 06:04:34 【问题描述】:

我在 log4j2 中定义了一个 RollingFile Appender

<RollingFile name="Locserver" append="true" fileName="locserver.log" filePattern="locserver-%i.log">
    <PatternLayout>
        <pattern>%dISO8601 [%t] %p %c %L - %m%n</pattern>
    </PatternLayout>
    <Policies>
        <SizeBasedTriggeringPolicy size="50 MB"></SizeBasedTriggeringPolicy>
                <DefaultRolloverStrategy>10</DefaultRolloverStrategy>
    </Policies>
</RollingFile>

但是当我尝试运行它时,我得到一个错误

IllegalStateException : 模式不包含日期 org.apache.logging.log4j.core.appender.rolling.PatternProcessor.getNExtTime(PatternProcessor.java:91)

只要我在 filePattern 中放入日期模式,例如locserver-%dMM-dd-yyyy-%i.log,这种情况就会消失。但我不想要日志名称中的日期。是我的配置有错误还是有什么问题?

【问题讨论】:

【参考方案1】:

谢谢乔。 我终于想通了。

我的策略列表中有一个空的 TimeBasedTriggeringPolicy 标记,它强制在 filePattern 中检查日期。一旦我删除它,它就开始正常工作了。

【讨论】:

【参考方案2】:

在 RollingFile appender 中,TimeBasedTrigerringPolicy 检查标记的 filepattern 属性中的 datepattern。使用 TimeBasedTrigerringPolicy 时必须指定 datepattern。

将包含 SimpleDate 模式的 %d... 放在 filePattern 中,例如:

<Appenders>
    <RollingFile name="RollingFile" fileName="logs/rpi_gpio_latest.log"
                 filePattern="logs/**%dyyyy-MM-dd_HH**_rpi_gpio_%i.log">
        <PatternLayout>
            <Pattern>%dHH:mm:ss.SSS [%t] %-5level %logger36 - %msg%n</Pattern>
        </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy />
            <SizeBasedTriggeringPolicy size="4 MB"/>
        </Policies>
        <DefaultRolloverStrategy fileIndex="max"/>
    </RollingFile>
</Appenders>

【讨论】:

【参考方案3】:

对我来说,这就像here 描述的那样工作(使用 log4j 2.0-beta9 和 Java 1.7)。

我的log4j.xml(大小策略设置为 1kB 仅用于测试):

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%d %-5p [%t] %C2 (%F:%L) - %m%n"/>
    </Console>
    <RollingFile name="Logfile"
                 fileName="Log/App.log"
                 filePattern="Log/App-%i.log">
      <PatternLayout pattern="%d %-5p [%t] %C2 (%F:%L) - %m%n"/>
      <Policies>
        <SizeBasedTriggeringPolicy size="1 KB"/>
      </Policies>
      <DefaultRolloverStrategy max="4"/>
    </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="info">
      <AppenderRef ref="STDOUT"/>
      <AppenderRef ref="Logfile"/>
    </Root>
  </Loggers>
</Configuration>

在使用您的配置片段时它也有效(我刚刚更正了 DefaultRolloverStrategy 设置):

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%d %-5p [%t] %C2 (%F:%L) - %m%n"/>
    </Console>
    <RollingFile name="Locserver"
                 append="true"
                 fileName="locserver.log"
                 filePattern="locserver-%i.log">
      <PatternLayout>
          <pattern>%dISO8601 [%t] %p %c %L - %m%n</pattern>
      </PatternLayout>
      <Policies>
          <SizeBasedTriggeringPolicy size="50 MB"></SizeBasedTriggeringPolicy>
      </Policies>
      <DefaultRolloverStrategy max="4"/>
    </RollingFile>
  </Appenders>
  <Loggers>
    <Logger name="eeo.tts" level="debug"/>
    <Root level="info">
      <AppenderRef ref="STDOUT"/>
      <AppenderRef ref="Locserver"/>
    </Root>
  </Loggers>
</Configuration>

您使用的是哪个版本的 log4j2?

【讨论】:

以上是关于log4j2 RollingFile Appender 需要日期模式的主要内容,如果未能解决你的问题,请参考以下文章

234期说说Log4j2中RollingFile的文件滚动更新机制

291期你了解Log4j2中RollingFile的文件滚动更新机制吗?

Log4j2 - Unable to invoke factory method in class org.apache.logging.log4j.core.appender.RollingFile

在 log4j2 中启用 LZMA(2)(即 `.xz`)压缩

log4j2配置文件详解(springboot+slf4j+log4j2+yaml+lombok)

使用appsettings.json配置Serilog RollingFile