我尝试根据log4j中MDC
传递的值生成不同的日志文件。尝试了几种方法后,我无法工作。
以下是我如何处理它。
在java代码中。我在MDC
。
public static void addHeadersToMDC(Map<String, String> headers) {
//headers contains other http headers such as uid,appid, client-type etc.
if (headers != null) {
Map<String, String> clonedHeaders =
new HashMap<String, String>(headers);
LogMasker.getInstance().maskHeaders(clonedHeaders);
clonedHeaders.put("APPNAME", "special");//setting APPNAME to MDC here.
for (String header : clonedHeaders.keySet()) {
ThreadContext.put(header, clonedHeaders.get(header))
}
}
}
在log4j2.xml中,我尝试通过执行将日志路由到相应的文件 &LT;
Routing name="Routing">
<Routes pattern="$${ctx:ROUTINGKEY}">
<Route key="async-perf">
<RollingFile name="Rolling-Async-Perf" fileName="/usr/local/logs/${ctx:APPNAME}.log"
filePattern="./logs/${date:yyyy-MM}/perf-%d{yyyy-MM-dd}-%i.log.gz" immediateFlush="false">
<PatternLayout charset="UTF-8">
<pattern>%d LogLevel=%p my_appid=%X{appid} uid=%X{uid} class=%c %m%n</pattern><!-- These values are populated correctly-->
</PatternLayout>
此处appid
,uid
的值根据传入的http标头(通过MDC)正确填充。
但是,我希望日志文件名为special.log
,但文件生成为${ctx:APPNAME}.log
我还尝试通过System.setProperty("APPNAME","special")
设置APPNAME并使用${sys:APPNAME}
引用它,但我未能获得预期的结果。
对于如何解决这个问题的任何想法都将非常感激。
答案 0 :(得分:0)
我不确定我对这个问题的一切了解,但你可以这样做:
/* Setting system property SomeProperty - used by log4j2 */
System.setProperty("SomeProperty", "someValue");
org.apache.logging.log4j.core.LoggerContext ctx = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
ctx.reconfigure();
(ctx.reconfigure()很重要)
然后在log4j2.xml中使用它,如下所示:
filePattern="${sys:SomeProperty}"
有帮助吗?
我想你已经看到了这个:http://logging.apache.org/log4j/2.x/faq.html#separate_log_files