最近处理一个问题,有一处莫名其妙的输出,无法定位是哪输出的,为了定位,借用了同事的一段代码,最终成功定位,代码的功能是将System.out.println输出的调用位置也一块输出,将这段代码放到项目入口就可以,springboot项目就放到 Application的Main方法的开头就好了,非常方便
将system.out.println的输出,输出调用类等其他参数的方法
try {
System.setOut(new java.io.PrintStream(System.out) {
private StackTraceElement getCallSite() {
for (StackTraceElement e : Thread.currentThread()
.getStackTrace()) {
if (!e.getMethodName().equals("getStackTrace")
&& !e.getClassName().equals(getClass().getName())) {
return e;
}
}
return null;
}
@Override
public void println(String s) {
println((Object) s);
}
@Override
public void println(boolean s) {
println((Object) s);
}
@Override
public void print(String s) {
print((Object) s);
}
@Override
public void print(boolean s) {
print((Object) s);
}
@Override
public void print(Object o) {
StackTraceElement e = getCallSite();
String callSite = e == null ? "??" :
String.format("%s.%s(%s:%d)",
e.getClassName(),
e.getMethodName(),
e.getFileName(),
e.getLineNumber());
super.print(o + "\t\tat " + callSite);
}
@Override
public void println(Object o) {
StackTraceElement e = getCallSite();
String callSite = e == null ? "??" :
String.format("%s.%s(%s:%d)",
e.getClassName(),
e.getMethodName(),
e.getFileName(),
e.getLineNumber());
super.println(o + "\t\tat " + callSite);
}
});
} catch (Exception e) {
e.printStackTrace();
}