日志框架logback的使用和配置详解,将INFO以上打印到info.log

1. 前言

Logback是由log4j创始人设计的又一个开源日志组件, 查了一些资料说比log4j的性能还好, 以后将会逐步地替代掉log4j. 那么现在就来学学怎么使用logback吧

2. 导入依赖

这里务必使用最新的版本

<dependency>
    <groupId>ch.qos.logbackgroupId>
    <artifactId>logback-classicartifactId>
dependency>

3、配置文件: logback-spring.xml (spring会识别这个文件)

resources目录中,按如下新建一个logback-spring.xml配置文件.

3.1 节点介绍

这个配置文件的节点的结构如下日志框架logback的使用和配置详解,将INFO以上打印到info.log_第1张图片

1. appender

appender是负责写日志的组件, 主要用来设置日志的输出位置, 日志文件的生成策略等

  1. ConsoleAppender: 把日志打印到控制台
  2. FileAppender: 把日志输出到文件
  3. RollingFileAppender: 滚动记录地把日志输出到文件, 也就是可以支持日志文件按文件大小拆分,或者按日期拆分. 它有下面几个子节点:
    :被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
    :如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。:对记录事件进行格式化。
    :当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。
    : 告知 RollingFileAppender 合适激活滚动。
    :当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。
    rollingPolicy: 这里只说几个常用热门的策略,TimeBaseRollingPolicy, SizeBasedTriggeringPolicy, 和``

TimeBaseRollingPolicy根据fileNamePattern标签来表示什么周期触发一次生成新的日志文件,maxHistory表示保存日志的最大单位时间, 下面这个表示每天生成一个日志文件,最多保存30天

 <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
         <fileNamePattern>logFile.%d{yyyy-MM-dd}.logfileNamePattern> 
         <maxHistory>30maxHistory> 
      rollingPolicy> 
      <encoder> 
         <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%npattern> 
      encoder> 
   appender> 

SizeBasedTriggeringPolicy表示基于文件大小进行滚动

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
      <file>test.logfile> 

      <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
          <fileNamePattern>tests.%i.log.zipfileNamePattern> 
          <minIndex>1minIndex> 
          <maxIndex>3maxIndex> 
      rollingPolicy> 

      <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
          <maxFileSize>5MBmaxFileSize> 
      triggeringPolicy> 
      <encoder> 
         <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%npattern> 
      encoder> 
   appender> 

上述配置表示按照固定窗口模式生成日志文件,当文件大于5MB时,生成新的日志文件。窗口大小是1到3,当保存了3个归档文件后,将覆盖最早的日志。

2. logger和root
  1. 设置logger
    我们用来设置某一个包或者具体的某一个类的日志打印级别、以及指定仅有一个name属性,一个可选的level和一个可选的addtivity属性。
  • name:用来指定受此loger约束的某一个包或者具体的某一个类。
  • level:用来设置打印级别(日志级别),大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
  • addtivity:是否向上级loger传递打印信息。默认是true。

可以包含零个或多个元素,标识这个appender将会添加到这个loger。

  1. 设置root
    也是元素,但是它是根logger。只有一个level属性,因为已经被命名为"root".
    level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG
    如果上面的logger没有设置level属性, 会继承root的属性

可以包含零个或多个元素,标识这个appender将会添加到这个logger。

比如:

<configuration>   
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">   
       
    <encoder>   
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>   
    encoder>   
  appender>   
   
     
  <logger name="logback"/>   
     
  <logger name="org.springframework.web" level="INFO" additivity="false">  
    <appender-ref ref="STDOUT"/>  
  logger>   
  
      
  <logger name="com.zgd.demo.LogerTest"  additivity="true">  
    <appender-ref ref="STDOUT"/>  
  logger>   
  
  <root level="DEBUG">             
    <appender-ref ref="STDOUT" />   
  root>     
configuration>

上面两个logger, 第一个的name是org.springframework.web,这样这个包下的所有类的日志,都会采取这个logger的设置, 等级是INFO, additivity是false, 所以不会向上传递, 日志等级是INFO
第二个的name是com.zgd.demo.LogerTest,这个类里的日志打印都会采用这个logger的设置, 因为没有设置等级, 使用默认ROOT的等级DEBUG, 因为additivity是true,所以会向上传递日志

3.2 过滤器

使用过滤器可以设置日志的传递. 日志经过各个过滤器,被抛弃或者被打印或者不处理
关于过滤器onMatch表示匹配大于这个级别的日志和onMismatch表示匹配小于于这个级别的日志,可以选的有
ACCEPT–打印
DENY– 不打印
NEUTRAL–交给下一个过滤器处理
比如:

onMatch=“ACCEPT” 表示匹配该级别及以上
onMatch=“DENY” 表示不匹配该级别及以上
onMatch=“NEUTRAL” 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
onMismatch=“ACCEPT” 表示匹配该级别以下
onMismatch=“NEUTRAL” 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
onMismatch=“DENY” 表示不匹配该级别以下的

注意顺序,级别大的在前

3.3 实例:

由于我使用了全局配置文件配置, 所以其中会有 ${log.home_url} 这样的参数 ,将其替换掉你需要的配置即可









<configuration scan="true" scanPeriod="60 seconds" debug="false">

    
    <jmxConfigurator/>

    
    <property name="log.home_dir" value="/usr/local/springboot/log"/>
    <property name="log.app_name" value="http-demo"/>
    
    <property name="log.maxHistory" value="30"/>
    <property name="log.level" value="debug"/>
    <property name="log.maxSize" value="5MB" />

    
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] %logger - %msg%n
            pattern>
        encoder>
    appender>

    
    
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            
            <level>ERRORlevel>
            
            <onMatch>ACCEPTonMatch>
            
            <onMismatch>DENYonMismatch>
        filter>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            
            <fileNamePattern>
                ${log.home_dir}/error/%d{yyyy-MM-dd}/${log.app_name}-%i.log
            fileNamePattern>
            
            <maxHistory>${log.maxHistory}maxHistory>
            
            <MaxFileSize>${log.maxSize}MaxFileSize>
        rollingPolicy>
        <encoder>
            <pattern>
                
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
            pattern>
        encoder>
    appender>


    
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            
            <level>WARNlevel>
            
            <onMatch>ACCEPTonMatch>
            
            <onMismatch>DENYonMismatch>
        filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            
            <fileNamePattern>${log.home_dir}/warn/%d{yyyy-MM-dd}/${log.app_name}-%i.logfileNamePattern>
            <maxHistory>${log.maxHistory}maxHistory>
            
            <MaxFileSize>${log.maxSize}MaxFileSize>
        rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
        encoder>
    appender>


    
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFOlevel>
            <onMatch>ACCEPTonMatch>
            <onMismatch>DENYonMismatch>
        filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.home_dir}/info/%d{yyyy-MM-dd}/${log.app_name}-%i.logfileNamePattern>
            <maxHistory>${log.maxHistory}maxHistory>
            <MaxFileSize>${log.maxSize}MaxFileSize>
        rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%npattern>
        encoder>
    appender>


    
    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUGlevel>
            <onMatch>ACCEPTonMatch>
            <onMismatch>DENYonMismatch>
        filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.home_dir}/debug/%d{yyyy-MM-dd}/${log.app_name}-%i.logfileNamePattern>
            <maxHistory>${log.maxHistory}maxHistory>
            <MaxFileSize>${log.maxSize}MaxFileSize>
        rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%npattern>
        encoder>
    appender>


    
    <appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>TRACElevel>
            <onMatch>ACCEPTonMatch>
            <onMismatch>DENYonMismatch>
        filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.home_dir}/trace/%d{yyyy-MM-dd}/${log.app_name}-%i.logfileNamePattern>
            <maxHistory>${log.maxHistory}maxHistory>
            <MaxFileSize>${log.maxSize}MaxFileSize>
        rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%npattern>
        encoder>
    appender>


    
    <appender name="app" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.home_dir}/app/%d{yyyy-MM-dd}/${log.app_name}-%i.logfileNamePattern>
            <maxHistory>${log.maxHistory}maxHistory>
            <MaxFileSize>${log.maxSize}MaxFileSize>
        rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%npattern>
        encoder>
    appender>




    
    <logger name="org.springframework.web" additivity="false" level="WARN">
        <appender-ref ref="WARN"/>
    logger>
    
    <logger name="com.zgd" additivity="false" level="DEBUG" >
        <appender-ref ref="app" />
        <appender-ref ref="ERROR" />
        
        <appender-ref ref="CONSOLE" />
    logger>



    
    <root>
        
        <level value="${log.level}"/>
        
        <appender-ref ref="CONSOLE"/>
        
        
        
        
        
        
    root>

configuration>

上面的配置我设置了一个name为com.zgd的logger ,因为我的所有类都是写在这个包下面的,我使用app(logger的级别以上都输出),ERROR(error级别以上的日志输出),CONSOLE(打印到控制台)这三个appender. 如果大家需要所有级别的日志分级别输出, 将ROOT节点注释打开就可以了

4. 代码

//注意导入的包都是slf4j的包
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogbackTest {

    private static final Logger LOGGER = LoggerFactory.getLogger(LogbackTest.class);

    public static void main(String[] args) {
        LOGGER.trace("logback的--trace日志--输出了");
        LOGGER.debug("logback的--debug日志--输出了");
        LOGGER.info("logback的--info日志--输出了");
        LOGGER.warn("logback的--warn日志--输出了");
        LOGGER.error("logback的--error日志--输出了");
    }

}

这里我将root中的级别改成了info , 所以只会输出info和比info级别更高的日志

级别:
trace-debug-info-warn-error-fetal

这里写图片描述

按照logger指定的输出级别输出,会覆盖root指定的级别。


更新 2019年12月6日16:28:36

有时候我们需要将info以上级别的都输出到info日志中,方便我们看异常信息,这时候上面的 match 和 dismatch什么的就不能满足要求了

解决办法: ch.qos.logback.classic.filter.ThresholdFilter这个过滤器

 
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            
            <level>INFOlevel>
        filter>
        <file>${logPath}/info.logfile>
        <append>trueappend>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/info/info-%d{yyyyMMdd}-%i.logfileNamePattern>
            
            <maxHistory>${maxHistory}maxHistory>
            
            <MaxFileSize>${maxSize}MaxFileSize>
        rollingPolicy>
        <encoder>
            <pattern>${pattern}pattern>
        encoder>
    appender>

你可能感兴趣的:(日志)