今天日志消费的服务器写kafka异常,在查日志的时候发现日志的详细信息为null。
一、SLF4j打印日志方法
静态分派
/**
* 静态分派至:void warn(String var1, Throwable var2);
*/
logger.warn("error msg: ", ex)
logger.warn("error msg: {}", ex)
/**
* 静态分派至:void warn(String var1, Object var2, Object var3);
*/
logger.warn("error msg: {} {}", "anything", ex);
/**
* 静态分派至:void warn(String var1, Object... var2);
*/
logger.warn("error msg: {} {}", "anything", "anything", ex);
logger.warn("error msg: {} {} {}", "anything", "anything", ex);
结论
1)logger的占位参数小于等于1时,会打印异常堆栈;
2)logger的占位参数大于等于2时,
如果参数和占位符相等,每个参数调用toString方法输出;
如果参数=占位符+1, 且最后一个为异常,则打印异常堆栈;
Note:异常类的toString方法输出内容是“类名+errorMessage”。如果是NPE,那么errorMessage为null;
public class Throwable implements Serializable {
public String toString() {
String s = getClass().getName();
String message = getLocalizedMessage();
return (message != null) ? (s + ": " + message) : s;
}
}
二、Demo类
public class NPETest {
static Logger logger = LoggerFactory.getLogger(NPETest.class);
public static void main(String[] args) {
try {
try {
long l = (Long) null;
} catch (Throwable e) {
// NPE的getMessage返回null
throw new MyException("内部异常信息" + e.getMessage(), e);
}
} catch (Throwable throwable) {
logger.warn("外部异常信息", throwable); // print error stack
logger.warn("外部异常信息{}", throwable); // print error stack
logger.warn("外部异常信息{}{}", "占位", throwable, throwable); // print error stack
logger.warn("外部异常信息{}{}", "占位", throwable); // Not print error stack
logger.warn("外部异常信息{}{}{}", "占位", "占位", throwable, throwable); // print error stack
logger.warn("外部异常信息{}{}{}", "占位", "占位", throwable); // Not print error stack
}
}
}
三、最后
重要的事情说三遍
使用SLF4j打印日志时一定保证“参数个数 = 占位符个数 + 1(异常)”,确保打印日志堆栈
使用SLF4j打印日志时一定保证“参数个数 = 占位符个数 + 1(异常)”,确保打印日志堆栈
使用SLF4j打印日志时一定保证“参数个数 = 占位符个数 + 1(异常)”,确保打印日志堆栈
网友评论