开发中 经常要在关键方法开始终了时 记录log日志 特别是方法名经常copy错误有没有
tomcat中提供了一个不错的方法不过StackTraceElement的数组下表要根据自己的需要修改了
当然宝宝之前用Thread.currentThread().getStackTrace()也是可以的
tomcat org.apache.juli.logging.DirectJDKLog
private void log(Level level, String msg, Throwable ex) { if (logger.isLoggable(level)) { // Hack (?) to get the stack trace. Throwable dummyException=new Throwable(); StackTraceElement locations[]=dummyException.getStackTrace(); // Caller will be the third element String cname = "unknown"; String method = "unknown"; if (locations != null && locations.length >2) { StackTraceElement caller = locations[2]; cname = caller.getClassName(); method = caller.getMethodName(); } if (ex==null) { logger.logp(level, cname, method, msg); } else { logger.logp(level, cname, method, msg, ex); } } }
testcase
package com.tomcatExt.startup;import java.util.Date;public class BootStart {// public static void main(String[] args) {// // TODO Auto-generated method stub// HttpConnector connector = new HttpConnector();// connector.start();// } public static void main(String[] args) { BootStart test = new BootStart(); test.testName1(); test.testName2(); } private void logStart(){ this.log("Start",null); } private void logEnd(){ this.log("End",null); } private void log(String msg,Throwable t){ Throwable throwable =new Throwable(); //StackTraceElement[] elements = Thread.currentThread().getStackTrace();//下标3 StackTraceElement[] elements = throwable.getStackTrace();//下标2 String strClassName = "unKnown"; String strMethodName = "unKnown"; String strLineNumber = "0"; if(elements.length>1){ strClassName = elements[2].getClassName(); strMethodName = elements[2].getMethodName(); strLineNumber = String.valueOf(elements[2].getLineNumber()); } System.out.println(String.format("[Class:%1$s][Method:%2$s][Line:%3$s][Time:%4$s]:%5$s", strClassName, strMethodName, strLineNumber, new Date(), msg )); if(t!=null){ t.printStackTrace(); } } private void testName1(){ this.logStart(); this.logEnd(); } private void testName2(){ this.logStart(); this.testName2_1(); this.logEnd(); } private void testName2_1(){ this.logStart(); this.testName2_1_2(); this.logEnd(); } private void testName2_1_2(){ this.logStart(); this.logEnd(); }}
运行结果:
[Class:com.tomcatExt.startup.BootStart][Method:testName1][Line:53][Time:Fri Mar 03 18:44:44 CST 2017]:Start
[Class:com.tomcatExt.startup.BootStart][Method:testName1][Line:54][Time:Fri Mar 03 18:44:44 CST 2017]:End [Class:com.tomcatExt.startup.BootStart][Method:testName2][Line:57][Time:Fri Mar 03 18:44:44 CST 2017]:Start [Class:com.tomcatExt.startup.BootStart][Method:testName2_1][Line:62][Time:Fri Mar 03 18:44:44 CST 2017]:Start [Class:com.tomcatExt.startup.BootStart][Method:testName2_1_2][Line:67][Time:Fri Mar 03 18:44:44 CST 2017]:Start [Class:com.tomcatExt.startup.BootStart][Method:testName2_1_2][Line:68][Time:Fri Mar 03 18:44:44 CST 2017]:End [Class:com.tomcatExt.startup.BootStart][Method:testName2_1][Line:64][Time:Fri Mar 03 18:44:44 CST 2017]:End [Class:com.tomcatExt.startup.BootStart][Method:testName2][Line:59][Time:Fri Mar 03 18:44:44 CST 2017]:End