为项目添加log日志时的代码简化

前言

一般情况下,会在controller的每个方法的第一行写上logger.info("【**Controller】【collectionInfo】开始...");,方法结束时再加上logger.info("【**Controller】【collectionInfo】结束...");,方便以后看日志时方便,可每次这么写也麻烦,可以用代码直接获取运行的类和方法

别人家的代码

单独写个工具类查看线程的名字Logprefix

看别人写的源码是

public class LogPrefix {
    public static String get() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        int l = stackTrace.length;
        String className = stackTrace[l - 1].getClassName();
        className = StringUtils.substringAfterLast(className, ".");
        return String.format("【%s】【%s】", className, stackTrace[l - 1].getMethodName());
    }
}
 @RequestMapping(value = "/findByModel")
    public String  find(@RequestParam  MultipartFile files) throws  Exception{
        log.info(Logprefix.get() + "开始");
        }

//2018-08-03 12:10:14.356  INFO 6876 --- [nio-8086-exec-1] c.j.f.Service.Impl.TestFaceServiceImpl   : 【TestFaceServiceImpl】【testFace】开始

但一直是显示[thread][run]开始,并没有显示运行的类名和方法名。

直接在使用的方法下加上String msgToPrint = Thread.currentThread().getStackTrace()[1].getMethodName();可以显示该方法名,但别人写的代码的意思是取最后一个methodName,所以决定打印一下所有的线程名

把就加了个循环,打印了一下获取的线程

getStackTrace
get
testFace
testFace
invoke0
invoke
invoke
invoke
doInvoke
invokeForRequest
invokeAndHandle
invokeHandlerMethod
handleInternal
handle
doDispatch
doService
processRequest
doGet
service
service
service
internalDoFilter
doFilter
doFilter
internalDoFilter
doFilter
doFilterInternal
doFilter
internalDoFilter
doFilter
doFilterInternal
doFilter
internalDoFilter
doFilter
doFilterInternal
doFilter
internalDoFilter
doFilter
doFilterInternal
doFilter
internalDoFilter
doFilter
invoke
invoke
invoke
invoke
invoke
invoke
service
service
process
process
doRun
run
runWorker
run
run
run

居然有这个多,但是真正需要的name在第3位,数组下标就应该是2

package com.jxl.face.Utils;

import org.apache.commons.lang3.StringUtils;

public class Logprefix {

        public static  String get() {
            StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
//            int l = stackTrace.length;
//            for(int i=0;i<l;i++){
//                System.out.println(stackTrace[i].getMethodName());
//            }
            String className = stackTrace[2].getClas sName();//com.jxl.face.Controller.TestFaceController
            className = StringUtils.substringAfterLast(className, ".");
            return String.format("【%s】【%s】", className, stackTrace[2].getMethodName());
        }
}

改了一下下标,果然正常需要显示的类名,方法名。

ps:大致代码如上,具体所取下角标的位置看测试代码吧,因为我不知道是不是和具体项目框架有关

猜你喜欢

转载自blog.csdn.net/cherry_xiu/article/details/81387876