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());
我有一个这样的日志记录语句:
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());