Log4J2定制记录器

时间:2018-08-16 14:41:57

标签: java log4j2

为了执行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 logger实现。

最干净的方法是什么?

1 个答案:

答案 0 :(得分:0)

我使用了http://logging.apache.org/log4j/2.0/manual/customloglevels.html#CustomLoggers中所述的扩展记录器的生成方法。问题是我必须在要记录的类中显式引用记录器实现,我希望可以只使用LogManager.getLogger(...)。