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

在 Verilog 中实现 log10 函数,可以使用数学函数库或者使用查表法来实现。以下是使用查表法的示例代码: ```verilog module log10 ( input [15:0] x, // 输入数值(需要取对数的数) output [7:0] result // 输出结果,为 x 取对数之后的整数部分 ); reg [15:0] table [0:99]; // 存储查表结果的数组 // 初始化查表数组 initial begin table[0] = 0; table[1] = 0; table[2] = 0; table[3] = 0; table[4] = 0; // ... table[95] = 1; table[96] = 1; table[97] = 1; table[98] = 1; table[99] = 1; end // 查表法取对数 always @(*) begin case (x[15:10]) 10'b0000000000: result = table[x[9:4]]; 10'b0000000001: result = table[x[9:4]+10]; 10'b0000000010: result = table[x[9:4]+20]; 10'b0000000011: result = table[x[9:4]+30]; // ... 10'b1111111100: result = table[x[9:4]+960]; 10'b1111111101: result = table[x[9:4]+970]; 10'b1111111110: result = table[x[9:4]+980]; 10'b1111111111: result = table[x[9:4]+990]; endcase end endmodule ``` 上述代码中,我们使用了一个包含 100 个元素的数组,每个元素存储了对应的数值的整数部分的对数。在模块的初始化块中,我们将数组中的元素进行了初始化。在 `always` 块中,我们根据输入数值 x 的高 6 位(即整数部分)进行查表,并将查找到的结果输出。 需要注意的是,在使用查表法,我们可能会遇到一些边界问题,例如输入数值小于等于 0 或大于等于 100000,这些情况需要特殊处理。另外,由于查表法只能得到整数部分的对数,如果需要得到小数部分的对数,则需要使用其他方法,例如线性插值法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值