【问题标题】:Log4j 2 : can't use the ContextMapLookup in RollingFileAppender fileName and filePatternLog4j 2:不能在 RollingFileAppender 文件名和文件模式中使用 ContextMapLookup
【发布时间】:2014-12-11 21:10:33
【问题描述】:

我正在使用 log4j 2.0.2 进行日志记录。我正在尝试将 ContextMapLookup 用于 RollingFileAppender 的 fileName 和 filePattern 属性,但我无法使其工作。

这是我在 REST 外观中的(简化的)地图初始化:

@GET
public Response logSomething(@QueryParam("param") String param) {
    ThreadContext.put("someName", "default");
    LOGGER.info("Param from query: {}", param);
    ThreadContext.clearMap();
    return Response.ok().build();
}

这是我的(简化为)配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n" />
    </Console>
    <RollingFile name="Rolling" 
                 fileName="logs/${ctx:someName}-webapps-metrics.log"
                 filePattern="logs/archives/${ctx:someName}-webapps-metrics-%i.log" >
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %m%n"/>
      <SizeBasedTriggeringPolicy size="5 KB"/>
    </RollingFile>
  </Appenders>
  <Loggers>

    <!-- My Logger using rollingFile -->
    <Logger name="com.ipanematech.rest.MyRESTFacade" level="info" additivity="false">
      <AppenderRef ref="Rolling" />
    </Logger>
    <Root level="warn">
      <AppenderRef ref="STDOUT" />
    </Root>
  </Loggers>
</Configuration>

在目录中创建了一个名为“{ctx”的文件。似乎获取上下文的表达式在这些属性中不起作用。

我尝试在 appender 的 PatternLayout 中使用上下文,效果很好。

在 fileName 和 filePattern 中,我尝试了不同的语法,但没有一个奏效:

  • ${ctx:someName}(如上例)

  • $${ctx:someName}

  • %X{someName}

【问题讨论】:

    标签: java logging configuration log4j2 rollingfileappender


    【解决方案1】:

    RoutingAppender 做你想做的事。请参阅 log4j2 常见问题页面以获取 detailed example

    【讨论】:

    • 请再问一个问题:我不明白为什么没有 RoutingAppender 就无法工作。使用 RoutingAppender 对我来说没问题,但出于好奇,我只是想知道为什么从技术上讲,使用简单的 RollingFileAppender 是不可能的?
    • RoutingAppender 有逻辑记录到多个目的地,甚至可以动态创建新文件,而 RollingFileAppender 只有一个目的地文件。 RollingFileAppender 可以进行翻转,但这只会将(单个)目的地移动到不同的文件。可以将该功能组合到单个 appender 中,但这种设计更灵活、更强大:它允许“多个目标”功能与所有类型的 appender 一起使用,而不仅仅是 RollingFileAppender。
    • 一开始我试图使用系统属性来选择日志目录 (${sys:catalina.base}),我看到了你在 2.1 中更正的 jira LOG4J-829。等待这个版本,我尝试将转换后的路径放在上下文中以将其用作我的文件模式。此时我不需要 RootingAppender,因为我只需要一个目标文件。如果我们使用 2.0.2 版本,该 Jira 是否还有其他解决方法?
    • 我不知道,抱歉。但 2.1 应该很快就会发布,希望在下周的某个时候发布。
    猜你喜欢
    • 2017-06-12
    • 1970-01-01
    • 2023-03-26
    • 2014-01-16
    • 2014-12-23
    • 2014-08-16
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    相关资源
    最近更新 更多