Logback很好地处理了这个问题。如果你有自由,我建议选择它。
假设你可以,你需要使用的是SiftingAppender。它允许您根据一些运行时值分隔日志文件。这意味着您有多种拆分日志文件的选项。
要在 上拆分文件requestId,您可以执行以下操作:
logback.xml
<configuration>
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>requestId</key>
<defaultValue>unknown</defaultValue>
</discriminator>
<sift>
<appender name="FILE-${requestId}" class="ch.qos.logback.core.FileAppender">
<file>${requestId}.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="DEBUG">
<appender-ref ref="SIFT" />
</root>
</configuration>
如您所见(在discriminator元素内部),您将区分用于在requestId. 这意味着每个请求都将转到一个匹配的文件requestId。因此,如果您有两个请求 whererequestId=1和一个请求 where requestId=2,您将有 2 个日志文件:1.log(2 个条目)和2.log(1 个条目)。
此时您可能想知道如何设置key. 这是通过将键值对放在MDC中来完成的(请注意,键与logback.xml文件中定义的键匹配):
请求处理器.java
public class RequestProcessor {
private static final Logger log = LoggerFactory.getLogger(RequestProcessor.java);
public void process(Request request) {
MDC.put("requestId", request.getId());
log.debug("Request received: {}", request);
}
}
这基本上就是一个简单的用例。现在,每次有不同(尚未遇到)id 的请求进来时,都会为其创建一个新文件。