如何通过MDC logback功能传递日志文件名

时间:2014-04-22 08:17:46

标签: logging logback mdc

我想使用logback MDC功能作为我的日志名称,但我在文件名中得到%PARSER_ERROR[X]。也许不可能为日志文件指定名称。在我的日志文件模式参数传递没有问题。 任何帮助将不胜感激。

这是我的logback.xml文件内容:

 <?xml version="1.0" encoding="UTF-8" ?>
    <configuration  scan="true" scanPeriod="60 seconds">
    <jmxConfigurator />
    <property scope="context" name="PATH_TO_LOGS" value="${catalina.base}/logs" />

       <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <file>${PATH_TO_LOGS}/app.log</file>

    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>ERROR</level>
    </filter>

   <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
    <fileNamePattern>${PATH_TO_LOGS}/%X{myDefinedName}.app.%i.log</fileNamePattern>
    <maxIndex>10</maxIndex>
   </rollingPolicy>

   <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    <maxFileSize>10MB</maxFileSize>
   </triggeringPolicy>

   <encoder>
   <pattern>%d{ISO8601} %-5level [%thread] %logger{36} - [%X{myDefinedName}] - %msg%n</pattern>
  </encoder>
  </appender>

  <root level="WARN">
    <appender-ref ref="FILE"/>
  </root>

    </configuration>

编辑:这是我的过滤器

private static final String NAME_TO_PASS = "myDefinedName";

    private String getParameter(ServletRequest request) {

    HttpServletRequest req = (HttpServletRequest) request;

    String parameter = req.getParameter(NAME_TO_PASS);
    HttpSession session = req.getSession();

    if(parameter != null) {
        session.setAttribute(NAME_TO_PASS, parameter);      
    } else {
        parameter = (String)session.getAttribute(NAME_TO_PASS);
    }
    return parameter;
    }

@Override
public void init(FilterConfig filterConfig) throws ServletException {   
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    try {
        MDC.put(NAME_TO_PASS, getParameter(request));
        chain.doFilter(request, response);
    } finally {
        MDC.remove(NAME_TO_PASS);
    }
}

@Override
public void destroy() {     
}

在某处,我读到我应该使用${myDefinedName}模式而不是%X{myDefinedName},但我无法正确检查,因为在没有MDC参数的应用部署过程中创建了日志。如何在MCD参数传递时开始记录?

1 个答案:

答案 0 :(得分:4)

在官方示例中使用了SiftingAppender,它可以正常工作:http://logback.qos.ch/manual/appenders.html#SiftingAppender

<configuration>

  <appender name="FILE" class="ch.qos.logback.classic.sift.SiftingAppender">
    <!-- in the absence of the class attribute, it is assumed that the
         desired discriminator type is
         ch.qos.logback.classic.sift.MDCBasedDiscriminator -->
    <discriminator>
      <key>myDefinedName</key>
      <defaultValue>unknown</defaultValue>
    </discriminator>
    <sift>
      <appender name="FILE-${myDefinedName}" class="ch.qos.logback.core.FileAppender">
        <file>${myDefinedName}.log</file>
        <append>false</append>
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern>
        </layout>
      </appender>
    </sift>
  </appender>

  <root level="WARN">
    <appender-ref ref="FILE" />
  </root>
</configuration>

如果该MDC值为null,则将defaultValue用作日志名称的区分值。