【未解决问题】封装slf4j在spring中无法输出正确的调用类

背景

要输出slf4j日志,需要在类上添加一行

private static final Logger log = LoggerFactory.getLogger(UserClass.class);

为了省去这个步骤,于是添加Log工具类,主要通过下面这个方法拿到调用这方法的Class,然后封装日志输出方法

  public static void info(String format, Object... arguments) {
   		StackTraceElement[] stackTrace = new Throwable().getStackTrace();
   		Logger log = LoggerFactory.getLogger(stackTrace[2].getClassName());
       	log.info(format,arguments);
    }

经过测试发现,在简单java项目中使用输出正确调用类名,而在spring boot 项目中输出的类名为Log,这显然是错误的。

错误

//错误输出结果,这里打印的类名是Log
2018-12-02 01:03:23 [INFO] [per.xxx.Log:110] - test

//正常输出 (MainController为调用Log.info()的类)
2018-12-02 01:03:23 [INFO] [per.xxx.MainController :15] - test

源码

1.spring boot controller

@Controller
public class MainController {

    @GetMapping("{url}")
    public String hello(@PathVariable String url){
        Log.info("test");
        return url;
    }

}

2.Log

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 日志工具类
 */
public class Log {


    public static Logger get(String name) {
        return LoggerFactory.getLogger(name);
    }

    public static Logger get(Class<?> clazz) {
        return LoggerFactory.getLogger(clazz);
    }

    public static Logger get() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        return LoggerFactory.getLogger(stackTrace[2].getClassName());
    }


    /**
     * Trace等级日志,小于debug
     *
     * @param format    格式文本,{} 代表变量
     * @param arguments 变量对应的参数
     */

    public static void trace(String format, Object... arguments) {
        trace(innerGet(), format, arguments);
    }


    /**
     * Trace等级日志,小于Debug
     *
     * @param log       日志对象
     * @param format    格式文本,{} 代表变量
     * @param arguments 变量对应的参数
     */

    public static void trace(Logger log, String format, Object... arguments) {
        log.trace(format, arguments);
    }


    /**
     * Debug等级日志,小于Info<br>
     *
     * @param format    格式文本,{} 代表变量
     * @param arguments 变量对应的参数
     */

    public static void debug(String format, Object... arguments) {
        debug(innerGet(), format, arguments);
    }


    /**
     * Debug等级日志,小于Info
     *
     * @param log       日志对象
     * @param format    格式文本,{} 代表变量
     * @param arguments 变量对应的参数
     */

    public static void debug(Logger log, String format, Object... arguments) {
        log.debug(format, arguments);
    }


    /**
     * Info等级日志,小于Warn
     *
     * @param format    格式文本,{} 代表变量
     * @param arguments 变量对应的参数
     */

    public static void info(String format, Object... arguments) {
        final Logger log = innerGet();
        info(log, format, arguments);
    }


    /**
     * Info等级日志,小于Warn
     *
     * @param log       日志对象
     * @param format    格式文本,{} 代表变量
     * @param arguments 变量对应的参数
     */

    public
    static void info(Logger log, String format, Object... arguments) {
        final Logger logs = log;
        logs.info(format, arguments);
    }


    /**
     * Warn等级日志,小于Error
     *
     * @param format    格式文本,{} 代表变量
     * @param arguments 变量对应的参数
     */

    public static void warn(String format, Object... arguments) {
        warn(innerGet(), format, arguments);
    }


    /**
     * Warn等级日志,小于Error
     *
     * @param log       日志对象
     * @param format    格式文本,{} 代表变量
     * @param arguments 变量对应的参数
     */

    public static void warn(Logger log, String format, Object... arguments) {
        log.warn(format, arguments);
    }


    /**
     * Warn等级日志,小于Error<br>
     *
     * @param e         需在日志中堆栈打印的异常
     * @param format    格式文本,{} 代表变量
     * @param arguments 变量对应的参数
     */

    public static void warn(Throwable e, String format, Object... arguments) {
        warn(innerGet(), e, format(format, arguments));
    }


    /**
     * Warn等级日志,小于Error
     *
     * @param log       日志对象
     * @param e         需在日志中堆栈打印的异常
     * @param format    格式文本,{} 代表变量
     * @param arguments 变量对应的参数
     */

    public static void warn(Logger log, Throwable e, String format, Object... arguments) {
        log.warn(format(format, arguments), e);
    }
    

    /**
     * Error等级日志
     *
     * @param format    格式文本,{} 代表变量
     * @param arguments 变量对应的参数
     */

    public static void error(String format, Object... arguments) {
        error(innerGet(), format, arguments);
    }


    /**
     * Error等级日志<br>
     *
     * @param log       日志对象
     * @param format    格式文本,{} 代表变量
     * @param arguments 变量对应的参数
     */

    public static void error(Logger log, String format, Object... arguments) {
        log.error(format, arguments);
    }


    /**
     * Error等级日志
     *
     * @param e         需在日志中堆栈打印的异常
     * @param format    格式文本,{} 代表变量
     * @param arguments 变量对应的参数
     */

    public static void error(Throwable e, String format, Object... arguments) {
        error(innerGet(), e, format(format, arguments));
    }


    /**
     * Error等级日志
     *
     * @param log       日志对象
     * @param e         需在日志中堆栈打印的异常
     * @param format    格式文本,{} 代表变量
     * @param arguments 变量对应的参数
     */

    public static void error(Logger log, Throwable e, String format, Object... arguments) {
        log.error(format(format, arguments), e);
    }


    /**
     * 格式化文本
     *
     * @param template 文本模板,被替换的部分用 {} 表示
     * @param values   参数值
     * @return 格式化后的文本
     */

    private static String format(String template, Object... values) {
        return String.format(template.replace("{}", "%s"), values);
    }

    /**
     * @return 获得日志,自动判定日志发出者
     */

    private static Logger innerGet() {
        StackTraceElement[] stackTrace = new Throwable().getStackTrace();
        return LoggerFactory.getLogger(stackTrace[3].getClassName());
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值