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(...) 代替。