大家好,我是IT修真院深圳分院第03期学员,一枚正直纯洁善良的程序员。今天给大家分享一下,修真院官网JAVA(职业)任务2的深度思考的扩展部分 —— SLF4J 和 Log4j2 怎么使用?
1.背景介绍
SLF4J是怎么诞生的?
很久很久以前,Apache说服log4j以及其他的日志按照commons-logging的标准编写,但是由于commons-logging的类加载器有点问题,实现起来也不友好,因此log4j的作者创作了SLF4J,也因此与commons-logging平分天下。到底使用哪一个,由开发者自己决定。
2.知识剖析
1)SLF4J到底是什么?
commons-logging和slf4j都是日志的接口,供用户使用,而没有提供实现。log4j、logback、java.logging才是日志的真正实现。当我们调用接口时,接口的工程会自动寻找恰当的实现,返回一个实现的实例。
2)SLF4J的实现原理什么?
3.常见问题
1)Log4j怎么结合SLF4J?
2)Log4j结合SLF4J有什么优势?
4.解决方案
1)Log4j怎么结合SLF4J
A.添加SLF4J的jar包
B.添加适配器jar包:slf4j-log4j12
tip:实际只添加适配器jar包就可以了。
2)Log4j结合SLF4J有什么优势?
有数据表明,一个应用程序中大约有4%的代码用来打日志。在代码中,我们经常需要把一些参数作为Debug级别的日志打印出来,方便我们进行调试。项目部署之前我们会把日志的级别调到INFO,项目正式运转的时候就不会打印Debug级别的日志。
但Log4j在这方面做的不太好,用到了isDebugEnable()并在项目刚运行时就拼接字符串存到内存里,这样不仅检查了两次日志级别,并占用了内存资源,导致性能比其他日志实现要差。这种操作会使得我们的代码看起来更像是在打日志而不是在实现某种功能。
通过结合SLF4J,Log4j也可使用参数替代字符串拼接,这样只会检查一次日志级别,且只在需要输出日志的时候才会拼接字符串。代码更优雅、性能也有提升。
5.代码实战
1)Log4j结合SLF4J
2)Log4j结合SLF4J前后的性能对比
3)Log4j2怎么使用
4)Log4j和Log4j2的性能对比
6.扩展思考
1)为什么要以类名作为logger的名字?
首先我们要知道,类通常以类代表的对象或者类可以实现的功能来命名,这种命名方式提高了可读性,易于他人 识别。同样的,以类名作为logger的名字可以快速定位产生日志的类,还可以更精确地对每个类的日志级别、输出目的地和输出样式进行调整。
2)Log4j 怎么迁移到 Log4j2?
A.前提条件
没有调用Log4j-1.x的内部方法,比如Appenders(),LoggerRepository()
没有使用代码的方式配置Log4j
没有调用DOMConfigurator或PropertyConfigurator这两个类
B.替换jar包
把 Log4j-1.x.jar 换成 log4j-1.2-api.jar(这个jar包内有log4j-api、log4j-core两个jar包)
C.修改代码
首先要清楚,jar包前缀不一样,版本1是org.apache.log4j,版本2是org.apache.logging.log4j
a.版本1是Logger.getLogger( ),改成版本2的LoggerManager.getLogger( )
b.版本1是Logger.getRootLogger( ),改成版本2的LoggerManager.getRootLogger( )
D.修改配置文件
log4j.properties换成log4j2.xml
7.参考文献
参考一 Log4j2 官网
参考二 Log4j 迁移到 Log4j2
参考四 SFL4J 官网
8.更多讨论
详细的过程在下面的视频中。
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧。