java日志详解--logback

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/paditang/article/details/78872476

前言

​ 关于logback这块,相关的文章比较多,而本人研究也不是比较深入,因此这篇文章只是本人的配置过程以及其他几篇深入介绍的文章,当作记录使用,希望能帮到自己和读者。

正文

对比log4j的优势:

更快的实现
Logback的内核重写了,在一些关键执行路径上性能提升10倍以上。而且logback不仅性能提升了,初始化内存加载也更小了。

非常充分的测试
Logback经过了几年,数不清小时的测试。Logback的测试完全不同级别的。在作者的观点,这是简单重要的原因选择logback而不是log4j。

Logback-classic非常自然实现了SLF4j
Logback-classic实现了SLF4j。在使用SLF4j中,你都感觉不到logback-classic。而且因为logback-classic非常自然地实现了SLF4J,所以切换到log4j或者其他,非常容易,只需要提供成另一个jar包就OK,根本不需要去动那些通过SLF4JAPI实现的代码。

非常充分的文档
官方网站有两百多页的文档。

自动重新加载配置文件
当配置文件修改了,Logback-classic能自动重新加载配置文件。扫描过程快且安全,它并不需要另外创建一个扫描线程。这个技术充分保证了应用程序能跑得很欢在JEE环境里面。

Lilith
Lilith是log事件的观察者,和log4j的chainsaw类似。而lilith还能处理大数量的log数据

谨慎的模式和非常友好的恢复
在谨慎模式下,多个FileAppender实例跑在多个JVM下,能够安全地写道同一个日志文件。RollingFileAppender会有些限制。Logback的FileAppender和它的子类包括RollingFileAppender能够非常友好地从I/O异常中恢复。

配置文件可以处理不同的情况
开发人员经常需要判断不同的Logback配置文件在不同的环境下(开发,测试,生产)。而这些配置文件仅仅只有一些很小的不同,可以通过,和来实现,这样一个配置文件就可以适应多个环境。

Filters(过滤器)
有些时候,需要诊断一个问题,需要打出日志。在log4j,只有降低日志级别,不过这样会打出大量的日志,会影响应用性能。在Logback,你可以继续保持那个日志级别而除掉某种特殊情况,如alice这个用户登录,她的日志将打在DEBUG级别而其他用户可以继续打在WARN级别。要实现这个功能只需加4行XML配置。可以参考MDCFIlter

SiftingAppender(一个非常多功能的Appender)
它可以用来分割日志文件根据任何一个给定的运行参数。如,SiftingAppender能够区别日志事件跟进用户的Session,然后每个用户会有一个日志文件。

自动压缩已经打出来的log
RollingFileAppender在产生新文件的时候,会自动压缩已经打出来的日志文件。压缩是个异步过程,所以甚至对于大的日志文件,在压缩过程中应用不会受任何影响。

堆栈树带有包版本
Logback在打出堆栈树日志时,会带上包的数据。

自动去除旧的日志文件
通过设置TimeBasedRollingPolicy或者SizeAndTimeBasedFNATP的maxHistory属性,你可以控制已经产生日志文件的最大数量。如果设置maxHistory为12,那那些log文件超过12个月的都会被自动移除。

简易配置:

  1. 导入依赖包官网下载页面

  2. 在classpath中添加logback.xml文件

  3. 配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- scan:更改后重载 period:检测时间 debug:打印内部消息 -->
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
    <contextName>logback</contextName>
    <property name="log.path" value="${TEST_LOG}/queue" />
    <!-- 输出到控制台 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 过滤器,过滤error以下所有日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <!-- 打印格式 -->
        <encoder>
            <pattern>[%thread] %-5level %logger{36}- %msg%n</pattern>
        </encoder>
    </appender>
    
    <appender name="file"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 今日日志名称,当今日过后自动改为fileNamePattern的名称 -->
        <file>${log.path}/queue.log</file>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间 -->
            <FileNamePattern>${log.path}/queue.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--只保留最近90天的日志 -->
            <maxHistory>90</maxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志 -->
            <!--<totalSizeCap>1GB</totalSizeCap> -->
        </rollingPolicy>
        <!--日志输出编码格式化 -->
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36}
                - %msg%n</pattern>
        </encoder>
    </appender>
    
    <root level="debug">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>
    </configuration>
  4. 测试代码

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class LogbackDemo {
    
    private static final Logger log = LoggerFactory.getLogger(LogbackDemo.class);
    
    public static void main(String[] args){
        log.debug("debug msg");
        log.info("info msg");
        log.warn("warn msg");
        log.error("error msg");
    }
    }
    // 测试结果
    [main] INFO  com.paditang.demo.LogbackDemo- info msg
    [main] WARN  com.paditang.demo.LogbackDemo- warn msg
    [main] ERROR com.paditang.demo.LogbackDemo- error msg
    
    // 文件输出
    13:32:56.888 logback [main] INFO  com.paditang.demo.LogbackDemo
                - info msg
    13:32:56.888 logback [main] WARN  com.paditang.demo.LogbackDemo
                - warn msg
    13:32:56.888 logback [main] ERROR com.paditang.demo.LogbackDemo
                - error msg
    

详细配置

参考文章:

logback logback.xml常用配置详解(一)configuration logger

logback logback.xml常用配置详解(二)appender

logback logback.xml常用配置详解(三)filter

总结

​ 可以看到logback作为java日志框架,不仅性能上领先于log4j,而且在细致化配置的方面同样更具优势。因此我们应该拥抱变化,采用更先进的日志配置框架–logback

猜你喜欢

转载自blog.csdn.net/paditang/article/details/78872476