我在Java 1.8下使用log4j 2 2.20.0和spring-boot 1.5.8,我特灵简化我的软件从bloatcode。为了记录消息,我目前使用这种方式:
#message.properties
message-1=Current time is {0}
message-2=Message for supplier at {0}
@Configuration
public class BeanDefinition {
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames("messages.poc");
return messageSource;
}
@Bean
public MessageSourceAccessor getMessageFormatAccessor(MessageSource messageSource) {
return new MessageSourceAccessor(messageSource);
}
}
@Component
@Log4j2
public class MessageSourceAccessorRunner implements ApplicationRunner {
@Autowired
private MessageSourceAccessor accessor;
@Override
public void run(ApplicationArguments args) throws Exception {
Object[] logArgs = {Instant.now()};
log.info(accessor.getMessage("message-1", logArgs));
}
}
我正在尝试做的是执行这样的事情,以保存我的代码从大量的bloatcode:
log.debug("message-2", logArgs);
其效果与
log.debug(() -> accessor.getMessage("message-2", logArgs));
意思是如果日志记录级别是DEBUG级别,则记录构造的消息,以保存性能。
有人能帮我解决这个问题吗?谢谢!
1条答案
按热度按时间jaxagkaj1#
Log4j 2.x如何解释日志调用的
(String, Object...)
参数是由日志记录器使用的MessageFactory
决定的。当你创建一个日志记录器时,你可以将
MessageFactory
作为第二个参数传递给LogManager#getLogger
调用(例如LogManager#getLogger(Class<?>, MessageFactory)
。要使用
MessageSource
化消息,您需要创建:Message
:上面的例子有一些缺点:
将丢弃
throwable
参数,而不是将其用作消息的throwable。您可以考虑在代码中编码参数的数量,以便MessageSourceMessage
可以将第一个附加参数用作throwable。ReusableMessage
,这样大多数时候都会使用同一个message示例。