背景
要输出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());
}
}