我想为我的日志名称使用 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 参数时才开始记录?