轉載請註明出處
我想要的日誌打印,是包含線程id,日誌所在文件,日誌所在的方法,以及日誌所在的行數,再加上log自帶的日級別和日誌內容。其他都好搞定,日誌所在文件,日誌所在的方法,以及日誌所在的行數,需要使用stackTrace(堆棧軌跡);
下面我們來看一段代碼:
public class TestClass { public static void main(String[] args) { new TestClass().methodA(); } private void methodA(){ System.out.println("------進入methodA----------"); methodB(); } private void methodB(){ System.out.println("------進入methodB----------"); StackTraceElement elements[] = Thread.currentThread().getStackTrace(); for (int i = 0; i < elements.length; i++) { StackTraceElement stackTraceElement=elements[i]; String className=stackTraceElement.getClassName(); String methodName=stackTraceElement.getMethodName(); String fileName=stackTraceElement.getFileName(); int lineNumber=stackTraceElement.getLineNumber(); System.out.println("StackTraceElement數組下標 i="+i+",fileName=" +fileName+",className="+className+",methodName="+methodName+",lineNumber="+lineNumber); } } }
輸出結果爲
可以看到分別輸出了這條打印語句在本堆棧中,在方法B中,在方法A中,在本文件中,的所在的位置。
那麼怎麼定位到我們想要的那一行呢?在網上看到了鴻洋大神的寫法
private static StackTraceElement getTargetStackTraceElement() {
// find the target invoked method
StackTraceElement targetStackTrace = null;
boolean shouldTrace = false;
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
for (StackTraceElement stackTraceElement : stackTrace) {
boolean isLogMethod = stackTraceElement.getClassName().equals(LogUtil.class.getName());
if (shouldTrace && !isLogMethod) {
targetStackTrace = stackTraceElement;
break;
}
shouldTrace = isLogMethod;
}
return targetStackTrace;
}
難點和原理講完了就差拼裝自己的LogUtil。
打印效果圖爲:
點擊下載源碼:
http://download.csdn.net/download/u010686002/10000706
備註:這是我第一個系列的微博,有意見可以在地下留言。
本文參考的文章:
http://blog.csdn.net/lmj623565791/article/details/52506545
http://blog.csdn.net/hp910315/article/details/52702199