为项目添加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:大致代码如上,具体所取下角标的位置看测试代码吧,因为我不知道是不是和具体项目框架有关

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值