我的问题是:我的应用程序维护了三个建筑物,每个建筑物都有不同的过程。
所以,使用logback,我想创建一个具有规范的日志: 每个建筑物都有一个特定的文件夹,在每个建筑物的特定文件夹中,会有很多日志文件,每个日志文件都表示一个过程。
我的logback.xml现在是:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<appender name="logAppender" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>processName</key>
<defaultValue>unknown</defaultValue>
</discriminator>
<sift>
<appender name="FILE-${processName}"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/${distributor}/${processName}.log</file>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern>
</layout>
<rollingPolicy
class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>logs/${distributor}/${processName}.%i.log</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>10</maxIndex>
<!-- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5KB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> -->
</rollingPolicy>
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
</appender>
</sift>
</appender>
<logger name="processLog" level="debug" additivity="false">
<appender-ref ref="logAppender" />
<appender-ref ref="stdout" />
</logger>
<root level="debug">
<appender-ref ref="stdout" />
<appender-ref ref="logAppender" />
</root>
</configuration>
我的java servlet代码是:
public class DistributorServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger processLog = LoggerFactory.getLogger("processLog");
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String office = req.getParameter("office");
MDC.put("distributor", office);
String process = req.getParameter("process");
MDC.put("process", process);
processLog.debug("Processing");
}
}
但是,不会生成日志文件。
任何人都可以帮助我吗?
非常感谢
答案 0 :(得分:0)
private static Logger processLog = LoggerFactory.getLogger("processLog");
到
private static Logger processLog = LoggerFactory.getLogger(DistributorServlet .class);
在logback.xml中,似乎只添加了一个discriminator
。您是否尝试为distributor
在使用后添加MDC.remove("keyName");
。
我在MDC.put
尝试添加多个密钥时遇到了问题。 (我想知道为什么没有定义putAll
)
虽然底层实现是应该允许添加多个键的HashMap<Key k, Value v>
的实现,但我只能看到放入MDC的最后一个键将应用于logback.xml
对于其他键,我发现_IS_UNDEFINED
值会被追加。
当然,你可以再次参考其他各种链接,虽然这可能不是一个好主意,但这是我在Java代码中所做的,
System.setProperty("distributor", req.getParameter("office"));
System.setProperty("process", req.getParameter("process"));
通过删除鉴别器来修改logback.xml。好吧,或者您可以删除上述属性之一并具有该属性的MDC.put。