java日志框架详解总结(含配置)

该篇是集合了百度众多的日志框架详解,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等等。
这么多的日志框架里如何选择。
首先需要梳理的是日志接口,以及日志接口对应的实现。然后再考虑如何选择使用哪个日志框架。
java日志框架详解总结(含配置)_第1张图片

java日志框架详解总结(含配置)_第2张图片

由图可知我们经常使用的日志框架实质上是一些接口的实现。而目前使用较广泛的统一日志规范接口就是slf4j和commons-logging。

slf4j

   它是基于API的java日志框架,slf4j提供了简单统一的日志记录的接口,开发者在配置部署
时只需要是吸纳这个接口就能是实现日志功能。它自身并没有提供具体的日志解决方案,它是负责
服务于各种各样的日志系统,允许用户在部署应用上使用自己常用的日志框架。
    也就是说,SLF4j是一个抽象层,它提供了众多的适配器能是配合其他所有开源日志框架。
为了考虑其他项目会使用大量的第三方库,而第三方库使用的日志框架又各不相同,不同的日志框
架又需要不同的配置,不同配置就会导致日志输出到不同的位置。所以我们就需要一个可以将日志
level、日志输出等统一管理,而slf4j的适配器又对各种日志都实现了接管,接管后就可以统一
配置这些第三方库中使用的日志。

commons-logging

commons-logging(jcl)也为众多日志实现库提供了统一的接口,作用和slf4j类似。它允许运行时绑定
任意的日志库。但commons-loggins对log4j和java.util.logging的配置问题兼容性不太好,还会
遇到类加载问题。所以当时log4j的作者又创作了slf4j.....

有了日志接口,就需要选择实现框架。在众多的日志框架如何选择

log4j

Log4j是apache下一个功能非常丰富的java日志库实现,Log4j应该是出现比较早而且最受欢迎的java
日志组件,它是基于java的开源的日志组件。Log4j的功能非常强大,通过Log4j可以把日志输出到控制
台、文件、用户界面。也可以输出到操作系统的事件记录器和一些系统常驻进程。值得一提的是:Log4j可
以允许你非常便捷地自定义日志格式和日志等级,可以帮助开发人员全方位的掌控自己的日志信息是一个日
志开源框架。

logback

logback是log4j的改进版本,而且原生支持slf4j(因为是同一作者开发)。所以logback+slf4j的组
合是日志框架的最佳选择。logback解决了log4j不能使用占位符的问题。logback可以通过jmx修改日
志配置,可以从jmx控制台直接操作,无需重启应用程序。它相比于log4j有更多的优点:

 - 原生实现了slf4j API(log4j需要中间层转换)
 - 支持xml、Groovy方式配置
 - 支持配置文件中加入条件判断
 - 更强大的过滤器
 - 更充分的测试
 - 更丰富的免费文档
 - 自动重载有变更的配置文件
 - 自动压缩历史日志
 等等

Log4j2

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>

你可能感兴趣的:(归纳总结集)