Log4J2 自定义记录器
Log4J2 custom logger
为了执行 JSON 日志记录,我使用了 Log4J2 中的属性(properties="true"):
<rollingFile name="JsonFile" fileName="logs/student-ds-service.json"
filePattern="logs/student-ds-service-%d{yyyy-MM-dd}-%i.json.gz">
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<JsonLayout complete="true" properties="true">
</JsonLayout>
</rollingFile>
它允许我执行以下操作:
try (final CloseableThreadContext.Instance ctc = CloseableThreadContext.putAll(map)) {
logger.info(message);
}
其中 "map" 是键和值的映射。它将在日志中呈现如下:
{
"timeMillis" : 1534426598078,
"thread" : "http-nio-auto-1-exec-2",
"level" : "INFO",
"loggerName" : "be.api.impl.V1ApiImpl",
"message" : "Get student data by citizenNumber=12345678901",
"endOfBatch" : false,
"loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
"contextMap" : {
"citizenNumber" : "12345678901"
},
"threadId" : 23,
"threadPriority" : 5
}
我的问题是我想编写一个自定义记录器来做这样的事情:
public void info(String message, Map<String, String> map) {
try (final CloseableThreadContext.Instance ctc = CloseableThreadContext.putAll(map)) {
logger.info(message);
}
}
其中 "logger" 是 log4j2 记录器实现。
最干净的方法是什么?
我使用了扩展记录器的生成,如 http://logging.apache.org/log4j/2.0/manual/customloglevels.html#CustomLoggers 中所述。问题是我必须在要记录的 class 中明确引用记录器实现,我希望可以只使用 LogManager.getLogger(...) 代替。
为了执行 JSON 日志记录,我使用了 Log4J2 中的属性(properties="true"):
<rollingFile name="JsonFile" fileName="logs/student-ds-service.json"
filePattern="logs/student-ds-service-%d{yyyy-MM-dd}-%i.json.gz">
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<JsonLayout complete="true" properties="true">
</JsonLayout>
</rollingFile>
它允许我执行以下操作:
try (final CloseableThreadContext.Instance ctc = CloseableThreadContext.putAll(map)) {
logger.info(message);
}
其中 "map" 是键和值的映射。它将在日志中呈现如下:
{
"timeMillis" : 1534426598078,
"thread" : "http-nio-auto-1-exec-2",
"level" : "INFO",
"loggerName" : "be.api.impl.V1ApiImpl",
"message" : "Get student data by citizenNumber=12345678901",
"endOfBatch" : false,
"loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
"contextMap" : {
"citizenNumber" : "12345678901"
},
"threadId" : 23,
"threadPriority" : 5
}
我的问题是我想编写一个自定义记录器来做这样的事情:
public void info(String message, Map<String, String> map) {
try (final CloseableThreadContext.Instance ctc = CloseableThreadContext.putAll(map)) {
logger.info(message);
}
}
其中 "logger" 是 log4j2 记录器实现。
最干净的方法是什么?
我使用了扩展记录器的生成,如 http://logging.apache.org/log4j/2.0/manual/customloglevels.html#CustomLoggers 中所述。问题是我必须在要记录的 class 中明确引用记录器实现,我希望可以只使用 LogManager.getLogger(...) 代替。