Java logback嵌套变量替换

Java logback nested variable substitution

我有一个这样的日志记录语句:

private static final Logger LOGGER = LoggerFactory.getLogger(Foo.class);

long elapsedTime = 8348; //test value
LOGGER.info("message:{},timestamp:{}",
                "Finished execution in {} milliseconds", elapsedTime,
                LocalDateTime.now());

我希望将前 2 个 {} 替换为字符串消息和本地日期时间。但是message里面的第三个{}应该换成long。所以它应该记录:

INFO  app.Foo - message:Finished execution in 8348 milliseconds,timestamp:2016-03-25T13:55:05.026

但它记录的是:

INFO  app.Foo - message:Finished execution in {} milliseconds,timestamp:5017

有什么方法可以为日志记录嵌套变量替换?我可以像这样连接字符串

long elapsedTime = 8348; //test value
LOGGER.info("message:{},timestamp:{}",
                "Finished execution in " + elapsedTime + " milliseconds",
                LocalDateTime.now());

但我想避免繁琐的连接。

我检查了 Logback 1.1.5

ch.qos.logback.classic.spi.LoggingEvent

和其中的 argumentArray。并且

org.slf4j.helpers.MessageFormatter.arrayFormat

不支持嵌套,仅支持附加参数中的对象数组。 我认为这同样适用于 Log4j。

它不会那样工作,因为消息值只是被替换而不是被解析。 var arg 参数用于主要消息格式。

我可以想到以下两个选项。

LOGGER.info("message:Finished execution in {} milliseconds,timestamp:{}", elapsedTime,
 LocalDateTime.now());

LOGGER.info("message:{},timestamp:{}", String.format("Finished execution in %s milliseconds",
 elapsedTime), LocalDateTime.now());