有一种想法,实现Log的Filter,将命中特殊规则的所有级别日志打印出来(即使是debug日志,以便于我们能够详细的排查信息)。【log日志】根据自定义规则,打印出特定日志。
但是debug打印详细日志时,即使debug的日志不打印,依旧会执行toJson的操作,存在性能问题。
解决方案有如下几种:
- 方案一:打印日志前,需要判断日志级别。写起来较为繁琐
if(logger.isDebugEnabled()) {
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}
- 方案二:使用占位符,以及Object对象的toString()方法
logger.debug("The new entry is {}. It replaces {}.", entry, oldEntry);
但需要注意的是:下面这种写法依旧会优先执行toJson的方法。
log.debug("{}" , objectMapper.writeValueAsString(something));
- 【推荐】方案三:适配器模式,增强toString()方法
public class LogJson {
private static final ObjectMapper MAPPER = new ObjectMapper(new JsonFactory()
.disable(INTERN_FIELD_NAMES));
private final Object object;
public static Object of(Object object) {
return new LogJson(object);
}
LogJson(Object object) {
this.object = object;
}
@Override
public String toString() {
if (object == null) {
return "null";
}
try {
return MAPPER.writeValueAsString(object);
} catch (Exception e) {
return object.toString();
}
}
}
日志打印:
log.info("{}",LogJson.of(user));