文档章节

Hutool之Slf4j Logger 的封装——Log

路小磊
 路小磊
发布于 2013/11/02 11:16
字数 1405
阅读 6675
收藏 13
点赞 2
评论 5

很多时候我们为了在类中加日志不得不写一行,而且还要去手动改XXX这个类名

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


第二个问题,我特别喜欢这种形式: 


log.info("我在XXX 改了 {} 变量", "name");
既省去了可恶的isInfoEnabled()的判断,还避免了拼接字符串,但是呀
log.error("错误消息", e);


这样就不支持了,烦躁……

写多了就觉得这种厌烦的工作实在让人无法忍受,于是就封装了下。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Log {
	/**
	 * 获得Logger
	 * @param clazz 日志发出的类
	 * @return Logger
	 */
	public static Logger get(Class<?> clazz) {
		return LoggerFactory.getLogger(clazz);
	}

	/**
	 * 获得Logger
	 * @param name 自定义的日志发出者名称
	 * @return Logger
	 */
	public static Logger get(String name) {
		return LoggerFactory.getLogger(name);
	}
	
	/**
	 * @return 获得日志,自动判定日志发出者
	 */
	public static Logger get() {
		StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
		return LoggerFactory.getLogger(stackTrace[2].getClassName());
	}
	
	//----------------------------------------------------------- Logger method start
	//------------------------ Trace
	/**
	 * Trace等级日志,小于debug<br>
	 * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
	 * @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
	/**
	 * Debug等级日志,小于Info<br>
	 * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
	 * @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
	/**
	 * Info等级日志,小于Warn<br>
	 * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
	 * @param format 格式文本,{} 代表变量
	 * @param arguments 变量对应的参数
	 */
	public static void info(String format, Object... arguments) {
		info(innerGet(), format, arguments);
	}
	
	/**
	 * Info等级日志,小于Warn
	 * @param log 日志对象
	 * @param format 格式文本,{} 代表变量
	 * @param arguments 变量对应的参数
	 */
	public static void info(Logger log, String format, Object... arguments) {
		log.info(format, arguments);
	}
	
	//------------------------ warn
	/**
	 * Warn等级日志,小于Error<br>
	 * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
	 * @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>
	 * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
	 * @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
	/**
	 * Error等级日志<br>
	 * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
	 * @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等级日志<br>
	 * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
	 * @param e 需在日志中堆栈打印的异常
	 * @param format 格式文本,{} 代表变量
	 * @param arguments 变量对应的参数
	 */
	public static void error(Throwable e, String format, Object... arguments) {
		error(innerGet(), e, format(format, arguments));
	}
	
	/**
	 * Error等级日志<br>
	 * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
	 * @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);
	}
	//----------------------------------------------------------- Logger method end
	
	//----------------------------------------------------------- Private method start
	/**
	 * 格式化文本
	 * @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 = Thread.currentThread().getStackTrace();
		return LoggerFactory.getLogger(stackTrace[3].getClassName());
	}
	//----------------------------------------------------------- Private method end
}
Demo:
import org.slf4j.Logger;

import xxx.Log;

public class Test {
	private static Logger log = Log.get();
	
	public static void main(String[] args) {
		//第一种使用方法(效率低)
		Log.debug("我是一条debug消息");
		
		//第二种使用方法
		Log.debug(log, "我是一条debug消息 {} {}", "参数1", "参数2");
		
		RuntimeException e = new RuntimeException("错误");
		
		//第一种使用方法(效率低)
		Log.error("我是一条error消息");
		
		//第二种使用方法
		Log.error(log, e, "<-异常对象放前面, 我是一条带参数的error消息 {} {}", "参数1", "参数2");
	}
}
总结下来如果日志比较少,可以直接使用静态方法Log.xxx,如果日志量很大,那么首先要构建好Logger,使用:
private static Logger log = Log.get();
 比之前简短了很多,而且随便复制。
调用Logger.xxx(log, "消息");

 对于不能使用format的情况,我把Throwable放在前面了,这样就可以使用动态参数了 Object... argument

好吧,就到这里,欢迎批评指正以及提供意见~~~ 

© 著作权归作者所有

共有 人打赏支持
路小磊

路小磊

粉丝 279
博文 53
码字总数 39918
作品 5
乌海
程序员
加载中

评论(5)

路小磊
路小磊

引用来自“easyboys”的评论

打印的行数、方法名不对,取的是封装类里面的,而不是原来调用的地方。

请升级到最新版。如果有问题欢迎issue
e
easyboys
打印的行数、方法名不对,取的是封装类里面的,而不是原来调用的地方。
我擦名字真难起
我擦名字真难起
刚好需要写一个日志工具类,学习了。
路小磊
路小磊

引用来自“aosica321”的评论

很受用,学习了 :)
谢谢~~
a
aosica321
很受用,学习了 :)
slf4j与jul、log4j1、log4j2、logback的集成原理

1 系列目录 - jdk-logging、log4j、logback日志介绍及原理- commons-logging与jdk-logging、log4j1、log4j2、logback的集成原理- slf4j与jdk-logging、log4j1、log4j2、logback的集成原理- s...

乒乓狂魔
2015/04/30
0
5
java日志,需要知道的几件事

java日志,需要知道的几件事 如果对于commons-loging 、log4j 、slf4j 、LogBack 等都已经非常清楚了,可以忽略本文。几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解...

maoxiajun
2012/02/10
0
2
java日志组件介绍(common-logging,log4j,slf4j,logback)

common-logging common-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,...

五大三粗
2015/11/04
0
0
jcl与jul、log4j1、log4j2、logback的集成原理

1 系列目录 - jdk-logging、log4j、logback日志介绍及原理- jcl与jul、log4j1、log4j2、logback的集成原理- slf4j与jdk-logging、log4j1、log4j2、logback的集成原理- slf4j、jcl、jul、log...

乒乓狂魔
2015/04/29
0
2
slf4j、jcl、jul、log4j1、log4j2、logback大总结

1 系列目录 - jdk-logging、log4j、logback日志介绍及原理- commons-logging与jdk-logging、log4j1、log4j2、logback的集成原理- slf4j与jdk-logging、log4j1、log4j2、logback的集成原理- s...

乒乓狂魔
2015/05/04
0
33
Java日志,需要知道的几件事(commons-logging,log4j,slf4j,logback)

如果对于commons-loging、log4j、slf4j、LogBack等都已经非常清楚了,可以忽略本文。几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解透的同学能有所帮助,当然如果对...

飓风2000
2017/10/24
0
0
2、slf4j、log4j 和 common-logging的关系

前面有一篇日志中简单的介绍了 log4j,同时也介绍了它与commons-logging的关系,但是突然冒出来一个slf4j,并且slf4j有取代commons-logging的趋势,所以,我们可以推知slf4j与commons-loggi...

丑陋的皮囊
07/13
0
0
java日志组件介绍(common-logging,log4j,slf4j,logback )

common-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,在程序运行时自动...

凯文加内特
2015/05/08
0
0
SLF4J: The requested version 1.5.8 by your slf4j

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticL......

测试-雨
2015/01/15
0
0
Spring3 MyBatis3 日志配置

//org.apache.ibatis.logging.LogFactory; static { } 查看Mybatis源码发现,他日志框架的寻找顺序:slf4j-->commons logging-->log4j 不能直接引入log4j jar包,因为即使我不导入slf4j的包,...

xingda
2012/04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

微信小程序Java登录流程(ssm实现具体功能和加解密隐私信息问题解决方案)

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、登录流程图 二、小程序客户端 doLogin:function(callback = () =>{}){let ...

公众号_好好学java
32分钟前
0
1
流利阅读笔记28-20180717待学习

“我不干了!” 英国脱欧大臣递交辞呈 雪梨 2018-07-17 1.今日导读 7 月 6 日,英国政府高官齐聚英国首相的官方乡间别墅——契克斯庄园,讨论起草了一份关于英国政府脱欧立场的白皮书。可是没...

aibinxiao
今天
6
0
OSChina 周二乱弹 —— 理解超算排名这个事,竟然超出了很多人的智商

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @-冰冰棒- :分享Ed Sheeran/Beyoncé的单曲《Perfect Duet (with Beyoncé)》 《Perfect Duet (with Beyoncé)》- Ed Sheeran/Beyoncé 手机...

小小编辑
今天
138
7
Android 获取各大音乐平台的真实下载地址

废话 电脑使用谷歌浏览器或者QQ浏览器的时候。。。。。。。说不清楚,还是看图吧 大概意思就是,只要网页上需要播放,只要能播放并且开始播放,这个过程就肯定会请求到相关的音乐资源,然后就...

她叫我小渝
今天
0
0
shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
今天
2
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
2
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
1
1
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部