最近在封裝一個(gè)Java報(bào)警的SDK黔衡,期望應(yīng)用程序在調(diào)用SDK報(bào)警API方法時(shí)能調(diào)用類和調(diào)用方法名并通過郵件和短信的方式通知給開發(fā)者腌乡。
大致有兩種方式,總結(jié)一下与纽。
1. 通過Throwable.getStackTrace()
StackTraceElement[] arr = (new Throwable()).getStackTrace();
for(int i=0; i<arr.length; i++) {
StackTraceElement el = arr[i];
System.out.println(i+"\t"+el.getClassName()+"\t" +el.getMethodName()+"\t"+el.getLineNumber());
}
簡(jiǎn)單模擬一下日志框架(log4j急迂、lobback)的功能,如下:
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* ${DESCRIPTION}
*
* @author Ricky Fung
*/
public class StackTraceTest {
public static void main(String[] args) {
Log log = new Log();
log.info("hello");
}
}
class Log {
public void info(String msg) {
System.out.println(String.format("%s | %s", getCaller(), msg));
}
public String getCaller() {
StackTraceElement[] arr = (new Throwable()).getStackTrace();
//打印格式: date | thread | class | msg
StringBuilder sb = new StringBuilder(100);
sb.append(getDate()).append(" | ").append(Thread.currentThread().getName()).append(" | ")
.append(arr[2].getClassName()).append('(').append(arr[2].getMethodName()).append(':').append(arr[2].getLineNumber()).append(')');
return sb.toString();
}
public String getDate() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}
}
打印結(jié)果:
2017-08-17 14:35:27 | main | com.yirendai.titan.alert.StackTraceTest(main:16) | hello
2. 通過Thread的方法getStackTrace()
JDK1.5在Thread類里面引入了getStackTrace()和getAllStackTraces()兩個(gè)方法袋毙。這下子,我們不用 (new Throwable()).getStackTrace ();可以調(diào)用
Thread.getCurrentThread().getStackTrace()來獲得當(dāng)前線程的運(yùn)行棧信息胀溺。不僅如此皆看,只要權(quán)限允許,還可以獲得其它線程的運(yùn)行棧信息腰吟。
StackTraceElement[] arr = Thread.currentThread().getStackTrace();
模擬日志框架,如下:
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* ${DESCRIPTION}
*
* @author Ricky Fung
*/
public class StackTraceTest {
public static void main(String[] args) {
Log log = new Log();
log.info("hello");
}
}
class Log {
public void info(String msg) {
StackTraceElement[] arr = Thread.currentThread().getStackTrace();
System.out.println(String.format("%s | %s", inferCaller(arr), msg));
}
public String inferCaller(StackTraceElement[] arr) {
//打印格式: date | thread | class | msg
StringBuilder sb = new StringBuilder(100);
sb.append(getDate()).append(" | ").append(Thread.currentThread().getName()).append(" | ")
.append(arr[2].getClassName()).append('(').append(arr[2].getMethodName()).append(':').append(arr[2].getLineNumber()).append(')');
return sb.toString();
}
public String getDate() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}
}