近期编写一个日志代码.需要定位类,方法.查了一些资料后写了下面这个方法.
在类的初始化时得到了方法的调用者信息。
import org.apache.log4j.Logger; /** */ /** * 系统日志记录类.封装了LOG4J的日志记录方法,并提供代码位置记录. * * @author 黄剑武 */ public class SysLog ... { private String cname = ""; private String mname = ""; private int line = 0; private String msgStr = ""; private Logger log = null; private SysLog() ...{ String fullClassName = "com.telemd.framework.common.SysLog"; // 首先得到调用栈 StackTraceElement[] stack = (new Throwable()).getStackTrace(); // 然后从栈中向上搜索,直到搜索到我们的日志类。 int ix = 0; int ic = 0; while (ix < stack.length) ...{ StackTraceElement frame = stack[ix]; cname = frame.getClassName(); if (fullClassName.equals(cname)) ...{ ix++; ic = ix; continue; } ix++; } // 此时ic位置放置的是SysLog类。 while (ic < stack.length) ...{ StackTraceElement frame = stack[ic]; cname = frame.getClassName(); if (!fullClassName.equals(cname)) ...{ mname = frame.getMethodName(); line = frame.getLineNumber(); break; } ix++; } log = Logger.getLogger(cname); msgStr = cname + "." + mname + "(" + cname + ".java:" + line + ") "; } /** *//** * 返回系统日志实例 * * @return */ public static SysLog getLog() ...{ return new SysLog(); } /** *//** * 消息级日志 * * @param message */ public void infoLog(String message) ...{ if (log.isInfoEnabled()) ...{ log.info(msgStr + message); } } /** *//** * 调试级日志 * * @param message */ public void debugLog(String message) ...{ if (log.isDebugEnabled()) ...{ log.debug(msgStr + message); } } /** *//** * 跟踪级日志 * * @param message */ public void traceLog(String message) ...{ if (log.isTraceEnabled()) ...{ log.trace(msgStr + message); } } /** *//** * 严重错误级日志 * * @param message */ public void fatalLog(String message) ...{ log.fatal(msgStr + message); } /** *//** * 错误级日志 * * @param message */ public void errorLog(String message) ...{ log.error(msgStr + message); } /** *//** * 警告级日志 * * @param message */ public void warnLog(String message) ...{ log.warn(msgStr + message); }}