近期编写一个日志代码.需要定位类,方法.查了一些资料后写了下面这个方法.
在类的初始化时得到了方法的调用者信息。
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);
}
}
/** */ /**
* 系统日志记录类.封装了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);
}
}