使用log4j打印日志,自己加了一层封装以便于自动打印出当前那个方法在执行。大概的实现如下:
import org.apache.log4j.Logger
public class A{
    private Logger logger;    public A(Class clz){
        this();
        this.logger = Logger.getLogger(clz);
    }    public log(){
        StackTraceElement[] eles = Thread.currentThread().getStackTrace();
        String methodName = eles[2].getMethodName();//在这里获取 调用 A.log()方法的方法名
        logger.debug(methodName );
    }
}
个人理解,上面的eles指向的方法如下;
eles[0] Thread.currentThread();
eles[1] A.log();
eles[2] 调用A.log()的方法,即我要在日志中打印出来的方法名。问题如下:
使用MyEclipse启动Tomcat进行测试,与我的预期保持一致,没有问题
但是直接启动Tomcat进行测试,打印出来的方法名是A.log(),eles[3] 才能打印出调用A.log()的方法。求原因和解决方案。

解决方案 »

  1.   

    这个不知道,但是我一般log都这么写public void sss(){
         logger.debug(类。sss====START);     logger.debug(类。sss====END);
    }
      

  2.   

    应该和eclipse装载tomcat有关吧
    api上说:
    public StackTraceElement[] getStackTrace()    返回一个表示该线程堆栈转储的堆栈跟踪元素数组。如果该线程尚未启动或已经终止,则该方法将返回一个零长度数组。如果返回的数组不是零长度的,则其第一个元素代表堆栈顶,它是该序列中最新的方法调用。最后一个元素代表堆栈底,是该序列中最旧的方法调用。 你可以在你log的地方
    new Exception("_____________").printStackTrace();
    看看他们的stackTrace是不是不一样另外当前的执行的方法是这么得到的吗? 我忘了
      

  3.   

    我把eles[i].getMethodName()都打出来了,
    MyEclipse启动tomcat:    getStackTrace
        log
        调用A.log()的方法直接启动tomcat:    dumpThreads
        getStackTrace
        log
        调用A.log()的方法查看了getStackTrace的内容,是调用的dumpThreads方法获取的返回结果,详细的方法调用堆栈应该是:
        dumpThreads
        getStackTrace
        currentThread
        log
        调用A.log()的方法currentThread()和dumpThreads都是标记了native的方法。
    MyEclipse启动Tomcat和直接启动都没有把currentThread方法放到堆栈中,MyEclipse启动Tomcat未把dumpThreads放到堆栈中但是直接启动Tomcat把dumpThreads放到了堆栈中。
      

  4.   

    这样可不可以 先定位当前的类在堆栈中的index 然后下一个就是method name 呢?
      

  5.   

    已经改过来来了,先找A.log()的方法在堆栈中的index,再取下一个index执行的方法作为method name。
      

  6.   

    你想知道是哪个方法打印的LOG么?
    我封装的MyLogger,好像没设置什么就能打印出来啊。import java.net.URL;import org.apache.log4j.Priority;
    import org.apache.log4j.PropertyConfigurator;
    import org.apache.log4j.Logger;public class MyLogger {
        private final String FQCN = MyLogger.class.getName();    private Logger myLogger = null;
        
        public MyLogger(String className) {        
            myLogger = Logger.getLogger(className);
            URL urlString = MyLogger.class.getResource("log.properties");
            PropertyConfigurator.configure(urlString);
        }    
        
        @SuppressWarnings("deprecation")
    public void info(String message){    
           myLogger.log(FQCN, Priority.INFO, message, null);
        }
        
        @SuppressWarnings("deprecation")
    public void error(Object e){
            myLogger.log(FQCN, Priority.ERROR, e, null);
        }
    }
      

  7.   

    log4j 应该能通过配置文件设置是不是打印method名 我不知道 没有仔细研究过 好多分啊