java日志篇(5)-logback

慢慢来比较快,虚心学技术

前言:Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback-classic和logback-access。
logback-core :其它两个模块的基础模块
logback-classic:log4j的一个改良版本(此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging)
logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能

一、logback+slf4j简单使用示例

①获取logback的jar包,最新jar包从官网https://logback.qos.ch/download.html下载,将其放在lib包目录下,并引入项目中;如果是maven项目,在pom文件中引入如下:


     ch.qos.logback
     logback-core
     1.1.7


     ch.qos.logback
     logback-access
     1.1.7


     ch.qos.logback
     logback-classic
     1.1.7

②获取slf4j的jar包,因为logback完整实现了slf4j的接口,所以需要依赖于slf4j实现功能。最新jar包从官网https://www.slf4j.org/download.html下载,如果是maven项目,在pom文件中引入如下:


    org.slf4j
    slf4j-api
    1.7.7

③代码编写

package SimpleTest;

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

/**
 * 简单日志获取
 */
public class SimpleTest {

    public static void main(String[] args) {
        //获取logger对象
        Logger logger = LoggerFactory.getLogger(SimpleTest.class);

        logger.info("info.....");
        logger.debug("debug...");
        logger.error("error...");
        logger.warn("warn...");

    }
}

④执行结果

22:14:47.606 [main] INFO SimpleTest.SimpleTest - info.....
22:14:47.611 [main] DEBUG SimpleTest.SimpleTest - debug...
22:14:47.611 [main] ERROR SimpleTest.SimpleTest - error...
22:14:47.611 [main] WARN SimpleTest.SimpleTest - warn...

二、logback加载过程

当我们使用logback-classic.jar时,应用启动,logback会按照如下顺序进行扫描:

  • 在系统配置文件System Properties中寻找是否有logback.configurationFile对应的value
  • 在classpath下寻找是否有logback.groovy(即logback支持groovy与xml两种配置方式)
  • 在classpath下寻找是否有logback-test.xml
  • 在classpath下寻找是否有logback.xml

以上任何一项找到之后都会停止,如果全部都不满足,则默认使用ch.qos.logback.classic.BasicConfigurator的configure方法,构造一个ConsoleAppender用于向控制台输出日志,默认日志输出格式为”%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} – %msg%n”。如本文简单实例所示

三、logback配置文件讲解

分析logbac配置文件节点如下:

(总配置)
    |----------------(动态日志级别)
    |----------------(定义变量值)
    |----------------(获取时间戳字符串)
    |----------------(设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default)
    |----------------(负责写日志的组件)
            |------------------(对日志进行格式化)
                    |----------------(指定日志格式化格式)           
            |------------------(输出为System.out或System.err)
            |------------------(被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。)
            |------------------(是否增加到文件末尾)
            |------------------(如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false)
            |------------------(日志输出过滤器)
                |----------------- (目标日志级别)
                |-----------------(符合输出条件的的日志行为)
                |-----------------(不符合日志级别的日志输出行为)
            |------------------(当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名)
                |-----------------(被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。)
                |-----------------(控制保留的归档文件的最大数量,超出数量就删除旧文件)
                |-----------------(活动文件的大小,默认值是10MB)
                |-----------------(当为true时,不支持FixedWindowRollingPolicy)
                |-----------------(告知 RollingFileAppender 何时激活滚动)
                |-----------------(对记录事件进行格式化)
    |----------------(所有(的上级)
            |-------------(标识这个appender将会添加到这个loger)
    |----------------(用来设置某一个包或具体的某一个类的日志打印级别、以及指定)
            |-------------(标识这个appender将会添加到这个loger)

1. 属性讲解

scan="true" //当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
scanPeriod="60 seconds" //设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug="false" //当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。


...........

  1. 属性讲解
    name="变量名" //定义变量的名称,引用处可以使用"{变量名}"引用
    value="变量值" //定义变量的值

     

3.属性及其子节点属性讲解

name="appender名称" //定义appender的名称
class="ch.qos.logback.core.ConsoleAppender" //logback的默认appender实现类

稍微讲解logback的集中appender类所具备的子节点及属性
①ch.qos.logback.core.ConsoleAppender 将日志输出到控制台



    
        
            
                
                %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n
            
        
        
        System.err
    

②ch.qos.logback.core.FileAppender 将日志输出到日志文件


   
            
            testFile.log 
            
            true 
             
             
            %-4relative [%thread] %-5level %logger{35} - %msg%n                                 
             
    

③ch.qos.logback.core.RollingFileAppender 将日志滚动输出到日志文件中


    
        
            
            ${log_dir}/warn/%d{yyyy-MM-dd}/warn-log.log
            
            ${maxHistory}
            
                
                1KB
            
        
    

及其子节点和属性讲解

name="com.data.test" 用来指定受此loger约束的某一个包或者具体的某一个类

level="debug" 用来设置打印级别,大小写无关

addtivity=true 是否向上级loger传递打印信息。默认是true

子节点 指定受logger约定的appender


   
    
    
        
    

讲解


   
    
        
        
        
        
        
        
    

四、Filter 等级过滤器

的一个子节点,表示在当前给到的日志级别下再进行一次过滤,最基本的Filter有ch.qos.logback.classic.filter.LevelFilter和ch.qos.logback.classic.filter.ThresholdFilter

我们看一下LevelFilter,其过滤策略是针对指定级别的日志是否显示,有三个子节点,

指定当前过滤的目标级别

指定当日志级别符合当前目标级别时的行为,有值ACCEPT接收,和DENY拒绝输出

指定当日志级别不符合当前目标级别时的行为,值同上


    
        
        
        
            
            ERROR
            
            ACCEPT
            
            DENY
        
        
            .....
        
    

我们再看一下 ThresholdFilter ,其过滤策略为针对指定级别以下的日志全部不显示,配置如下:


    
        
            
            ERROR
        
        
            .....
        
    

五、进阶Demo

综合案例如下:
使用网上现成可用的配置logback-test.xml如下:









    
    
    
    
    
    

    
    
        
            
                
                %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n
            
        
        System.err
    

    
    
    
        
        
        
            
            ERROR
            
            ACCEPT
            
            DENY
        
        ${log_dir}/error/error-log.log
        
        
            
            
                ${log_dir}/error/error-log.%d.%i.log
            
            
            ${maxHistory}
            
                
                1KB
            
        
        
            
                
                %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n
            
        
    

    
    
        
        
        
            
            WARN
            
            ACCEPT
            
            DENY
        
        
            
            ${log_dir}/warn/%d{yyyy-MM-dd}/warn-log.log
            ${maxHistory}
        
        
            %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n
        
    

    
    
        
            INFO
            ACCEPT
            DENY
        
        
            ${log_dir}/info/%d{yyyy-MM-dd}/info-log.log
            ${maxHistory}
        
        
            %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n
        
    

    
    
        
            DEBUG
            ACCEPT
            DENY
        
        
            ${log_dir}/debug/%d{yyyy-MM-dd}/debug-log.log
            ${maxHistory}
        
        
            %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n
        
    

    
    
        
            TRACE
            ACCEPT
            DENY
        
        
            ${log_dir}/trace/%d{yyyy-MM-dd}/trace-log.log
            ${maxHistory}
        
        
            %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n
        
    

    
    
        
        
        
        
        
        
        
        
        
        
    

程序代码:

package SimpleTest;

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

/**
 * 简单日志获取
 */
public class SimpleTest {

    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(SimpleTest.class);

        logger.info("info.....");
        logger.debug("debug...");
        logger.error("error...");
        logger.warn("warn...");
    }
}

输出结果如下:

控制台输出

2019-02-04 16:48:43.703 INFO  SimpleTest.SimpleTest - info.....
2019-02-04 16:48:43.703 DEBUG SimpleTest.SimpleTest - debug...
2019-02-04 16:48:43.703 ERROR SimpleTest.SimpleTest - error...
2019-02-04 16:48:43.703 WARN  SimpleTest.SimpleTest - warn...

日志文件输出
2019-02-04 14:39:04.496 DEBUG SimpleTest.SimpleTest - debug...

输出日志目录:


java日志篇(5)-logback_第1张图片
log目录结构

总结

1.logback完整实现了slf4j的接口,所以依赖于slf4j实现功能

2.logback的配置需要配置输出源appender,输出日志的logger和根logger root

3.logback通过filter实现对特定日志级别的过滤输出

参考文档

【1】logback官方文档

【2】http://www.importnew.com/28541.html

【3】https://www.cnblogs.com/warking/p/5710303.html

你可能感兴趣的:(java日志篇(5)-logback)