该篇是集合了百度众多的日志框架详解,java日志框架分析的总结篇。
具体网址:
https://blog.csdn.net/foreverling/article/details/51385128
https://blog.csdn.net/chszs/article/details/8653460
http://baijiahao.baidu.com/s?id=1585361583532845302&wfr=spider&for=pc
http://www.importnew.com/28541.html
https://blog.csdn.net/victor_cindy1/article/details/78716917
https://zhuanlan.zhihu.com/p/24275518
https://my.oschina.net/aiguozhe/blog/87981
http://www.importnew.com/28541.html
https://blog.csdn.net/xktxoo/article/details/76359299
主要的就是这些了。
java里常见的日志库有java.util.logging(JDKlog)、Apache log4j、log4j2、logback、slf4j等等。
这么多的日志框架里如何选择。
首先需要梳理的是日志接口,以及日志接口对应的实现。然后再考虑如何选择使用哪个日志框架。
由图可知我们经常使用的日志框架实质上是一些接口的实现。而目前使用较广泛的统一日志规范接口就是slf4j和commons-logging。
它是基于API的java日志框架,slf4j提供了简单统一的日志记录的接口,开发者在配置部署
时只需要是吸纳这个接口就能是实现日志功能。它自身并没有提供具体的日志解决方案,它是负责
服务于各种各样的日志系统,允许用户在部署应用上使用自己常用的日志框架。
也就是说,SLF4j是一个抽象层,它提供了众多的适配器能是配合其他所有开源日志框架。
为了考虑其他项目会使用大量的第三方库,而第三方库使用的日志框架又各不相同,不同的日志框
架又需要不同的配置,不同配置就会导致日志输出到不同的位置。所以我们就需要一个可以将日志
level、日志输出等统一管理,而slf4j的适配器又对各种日志都实现了接管,接管后就可以统一
配置这些第三方库中使用的日志。
commons-logging(jcl)也为众多日志实现库提供了统一的接口,作用和slf4j类似。它允许运行时绑定
任意的日志库。但commons-loggins对log4j和java.util.logging的配置问题兼容性不太好,还会
遇到类加载问题。所以当时log4j的作者又创作了slf4j.....
有了日志接口,就需要选择实现框架。在众多的日志框架如何选择
Log4j是apache下一个功能非常丰富的java日志库实现,Log4j应该是出现比较早而且最受欢迎的java
日志组件,它是基于java的开源的日志组件。Log4j的功能非常强大,通过Log4j可以把日志输出到控制
台、文件、用户界面。也可以输出到操作系统的事件记录器和一些系统常驻进程。值得一提的是:Log4j可
以允许你非常便捷地自定义日志格式和日志等级,可以帮助开发人员全方位的掌控自己的日志信息是一个日
志开源框架。
logback是log4j的改进版本,而且原生支持slf4j(因为是同一作者开发)。所以logback+slf4j的组
合是日志框架的最佳选择。logback解决了log4j不能使用占位符的问题。logback可以通过jmx修改日
志配置,可以从jmx控制台直接操作,无需重启应用程序。它相比于log4j有更多的优点:
- 原生实现了slf4j API(log4j需要中间层转换)
- 支持xml、Groovy方式配置
- 支持配置文件中加入条件判断
- 更强大的过滤器
- 更充分的测试
- 更丰富的免费文档
- 自动重载有变更的配置文件
- 自动压缩历史日志
等等
log4j2是log4j的升级版本2.x但并不兼容log4j因为它基本上把log4j版本的核心全部重构掉了,log4j2设计上很大程度模仿了slf4j-logback,性能也
获得了很大的提升。具体的差异自行百度。
至于网上不少说的性能比较,应该都是单个框架比较。但与slf4j绑定使用的话,怎么说都是logback性能最佳吧(猜测,欢迎指正)
日志level定义应该遵循以下几个:
- debug: 完整详细的记录流程的关键路径,用于开发人员比较感兴趣的跟踪和调试信息,生产环境中正常不会打开debug状态
- info: 应简洁明确让管理员确定状态,记录相当重要有意义的信息。关键的系统参数的回显、后台服务的初始化状态、需要系统管理员确认的关键信息都需要使用info级别
- warn: 能清楚告知发生了什么情况,指示潜在问题能引起别人重视,但不一定需要处理
- error: 系统出现异常或不希望出现的问题,能及时得到关注处理。但也不是所有的异常都记录成error
根据上述,这里将以slf4j为日志接口,而其中logback与slf4j配合桥接性能最优,所以在日志实现上选择logback。
此处以maven进行管理,首先引入依赖,这两个依赖就够了,版本可根据需求修改
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.7.22version>
dependency>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-classicartifactId>
<version>1.1.6version>
dependency>
classpath中编写logback的配置文件logback.xml, logback.xml文件放在/src/main/resources/路径中
logback.xml
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="CONTEXT_NAME" value="logback-test" />
<contextName>${CONTEXT_NAME}contextName>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS}|%level|%class|%thread|%method|%line|%msg%n
pattern>
encoder>
appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logs.dir}/logback-test.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>${logs.dir}/logback-test.%i.logFileNamePattern>
<minIndex>1minIndex>
<maxIndex>1maxIndex>
rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>30MBmaxFileSize>
triggeringPolicy>
<encoder>
<charset>UTF-8charset>
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS}|%level|%class|%thread|%method|%line|%msg%n
Pattern>
encoder>
appender>
<root>
<level value="WARN" />
<appender-ref ref="stdout" />
<appender-ref ref="file" />
root>
<logger name="xuyihao.logback.test" level="DEBUG" additivity="true">logger>
configuration>