美文网首页spring boot
logback(一)—整合SpringBoot配置

logback(一)—整合SpringBoot配置

作者: 小胖学编程 | 来源:发表于2019-07-01 15:18 被阅读92次

    SLF4J——Simple Logging Facade For Java,他是一个针对各类java日志框架的统一Facade(门面)抽象。Java日志框架众多——常用的有java.util.logging、log4j、logback、commons-logging。而SLF4J定义了统一的日志抽象接口,而真正的日志实现实际上是在运行时决定的——它提供了各类日志框架的binding。

    默认情况下,SpringBoot会使用Logback来记录日志,并且INFO级别输出到控制台。

    1. 时间日期:精确到毫秒。
    2. 日志级别:ERROR> WARN>INFO>DEBUG > TRACE  优先级如前面,默认情况下是INFO,则INFO以及优先级更高的WARN和ERROR会被显示。
    3. 进程ID:就是PID。
    4. 分割符:---标识实际日志的开始。
    5. 线程名:方括号括起来(可能会截断控制台的输出)。
    6. Logger名:通常使用源代码的类名。
    7. 日志内容。
    logging输出格式

    1. 日志的默认配置

    1. 引入maven依赖

    实际上spring-boot-starter-web依赖中已经引用了该日志的依赖,我们无需在引用下面的依赖了。

    <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-logging</artifactId>
     </dependency>
    

    2. 日志的输出级别

    日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出。

    3. 控制台输出

    Spring Boot中默认将ERROR、WARN、INFO级别的日志输出到控制台。可以在application.properties中配置:

    debug=true
    

    那么核心Logger(包含嵌入式容器、hibernate、spring)会输出更多的内容,但是应用的日志并不会输出为DEBUG级别。

    4. 文件输出

    默认情况下,Spring Boot将日志输出到控制台,不会写到日志文件。如果要编写除控制台之外的日志文件,则需要在application.properties中设置logging.file或logging.path属性。

    logging.file=my.log
    logging.path=/var/log
    
    • logging.file,设置文件,可以是绝对路径,也可以是相对路径,并写入日志内容。
    • logging.path,设置目录,会在该目录下创建一个spring.log文件,并写入日志内容。

    注:两者不能同时使用,如若同时使用,则只有logging.file生效。

    (1)默认情况下,日志文件的大小到达10MB时会切分一下,产生新的日志文件。
    (2)默认级别为:ERROR、WARN、INFO。

    2. 日志的个性化配置

    1. 日志级别的配置

    可以在application.properties中配置日志级别。

    logging:
      level:
        com.tellme.mapper: DEBUG
    
    • logging.level:日志级别前缀,*为包名或Logger名。
    • LEVEL:选项为TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF。

    注:即使在logback-spring.xml设置的打印级别是info,但是在配置文件中配置的打印级别是debug,则按照配置文件执行。

    2. 完全控制和解析日志配置

    由于日志服务都在ApplicationContext创建前就开始初始化了,它并不是必须通过Spring的配置文件进行控制,所以,现在application.properties中配置些许属性已经不能完全满足需求。
    故需要通过系统属性传统的Spring Boot外部配置文件才可以很好的支持日志的控制和管理。

    2.1 外部的配置文件应该叫什么名字?

    根据不同的日志系统,可以按照如下的规则组织配置文件名:

    • Logback:logback-spring.xml,logback-spring.groovy,logback.xml,logback.groovy

    • Log4j:log4j-spring.properties,log4j-spring.xml,log4j.properties,log4j.xml

    • Log4j2:log4j2-spring.xml,log4j2.xml

    • JDK(java Util Logging):logging.properties

    注:Spring Boot官方推荐优先使用带有-spring的文件名作为日志配置(如使用logback-spring.xml而不是使用logback.xml),命名为logback-spring.xmlde日志配置文件,Spring Boot可以为它添加一些Spring Boot特有的配置项【例如:spring boot的profile多环境配置】。

    2.2 日志文件应该放在哪?

    放在src/main/resources下面即可。

    2.3 若不使用logback.spring.xml名字,使用自己定义的日志配置文件名可以不?

    可以通过logging.config属性指定自定义的名字:

    logging.config=classpath:logging-自定义.xml
    

    2.4 如何实现spring boot多环境日志配置?

    1. 日志配置文件名应定义为logback-spring.xml。
    2. 在日志配置文件中,使用<springProfile name="dev"></springProfile>标签来包住这种环境下使用的配置。
    <springProfile name="dev">
      <root>
         <appender-ref ref="consoleAppender"/>
      </root>
    </springProfile>
    

    若是多个环境,使用,号隔开

    <!--测试环境+开发环境,多个使用逗号隔开-->
    <springProfile name="test,dev">
      <logger name="com.tellme.controller" level="info"/>
    </springProfile>
    <springProfile name="prod">
      <logger name="com.tellme.controller" level="debug"/>
    </springProfile>
    
    <!--注:这里一定要放到springProfile中,否则本机执行的时候还是会去寻找对应的文件-->
    <springProfile name="dev">
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
          <encoder>
              <pattern>[%t] [%X{traceRootId}] (%file:%line\): %m%n</pattern>
                    <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
              <charset>UTF-8</charset>
          </encoder>
      </appender>
    </springProfile>
    
    1. 在application.properties配置文件中,选中激活哪一种或哪几种环境。
    #激活开发资源文件
    spring.profiles.action=dev
    #叠加多个资源文件
    spring.profiles.include=dev,test,pro
    

    2.5 如何显示的使用application.properties的配置

    1. <springProperty>标签允许我们从Spring中显示属性,以便在logback中使用。
    2. 若是需要一个后备值,以防该属性未配置,则可以使用defaultvalue属性。
    <configuration>
        <springProperty scope="context" name="logPath" source="log.out.path" defalutValue="/app/test.log"/>
    </configuration>
    

    在application.properties的配置

    log.out.path="/app/test.log"
    

    3. 分解基本的logback-spring.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
    
        <contextName>logback</contextName>
        <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
        <property name="log.path" value="E:\\log\\logback.log" />
    
        <!--输出到控制台-->
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
            </filter>
            <encoder>
                <!--<pattern>%d %p (%file:%line\)- %m%n</pattern>-->
                <!--格式化输出:%d:表示日期    %thread:表示线程名     %-5level:级别从左显示5个字符宽度  %msg:日志消息    %n:是换行符-->
                <pattern>控制台-%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n</pattern>
                <charset>GBK</charset>
            </encoder>
        </appender>
    
        <!--输出到文件-->
        <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${log.path}</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>logback.%d{yyyy-MM-dd}.log</fileNamePattern>
                <maxHistory>30</maxHistory>
                <totalSizeCap>1GB</totalSizeCap>
            </rollingPolicy>
            <encoder>
                <!--格式化输出:%d:表示日期    %thread:表示线程名     %-5level:级别从左显示5个字符宽度  %msg:日志消息    %n:是换行符-->
                <pattern>文件记录-%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
                <charset>GBK</charset>
            </encoder>
        </appender>
    
        <root level="info">
            <appender-ref ref="console" />
            <appender-ref ref="file" />
        </root>
    
        <logger name="com.sxd.controller"/>
        <logger name="com.sxd.util.LogTestController" level="WARN" additivity="false">
            <appender-ref ref="console" />
        </logger>
    
    
    
    </configuration>
    

    3.1 根节点<Configuration>包含的属性

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

    根节点<configuration>的子节点:
    <configuration>下面共有2个属性,3个子节点,分别是:

    属性一:设置上下文名称<contextName>

    每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用<contextName>设置成其他名字,用来区分不同应用程序的记录。一旦设置不可修改,可以通过%contextName来打印日志上下文名称。

    <contextName>logback</contextName>
    

    属性二:设置变量<property>

    用来定义变量的标签,<property>有两个属性:name和value,其中name的值是变量的名称,value的值是定义变量的值。通过<property>定义的值会被插入到logger上下文中。定义变量后,可以使用"${}"来使用变量。

    <property name="log.path" value="D://app/logback.log">

    子节点一:<appender>

    appender用来格式化日志输出节点,有两个属性name和class,class用来指定哪种输出策略,常用的就是控制台输出和文件输出策略。

    1. 控制台输出ConsoleAppender
    concole[肯扫]

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
           <encoder>
                <pattern>%d %p [%t] (%file:%line\): %m%n</pattern>
                    <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
                <charset>UTF-8</charset>
            </encoder>
    </appender>
    

    <encoder>表示对日志进行编码:

    • %d ——日志输出时间
    • %p ——日志级别
    • %t ——输出日志的进程的名字
    • %file ——输出日志的文件名
    • %line ——输出日志的行数
    • %m ——日志消息
    • %n ——平台的换行符

    2. 输出到文件RollingFileAppender

    另一种常见的日志输出到文件,随着应用时间越来越长,日志也会增长的越来越多,将他们输出到同一文件并非一个好方法。RollingFileAppender用于切分文件日志。

    <appender name="cleanLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <File>log/catalina.out</File>
            <!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 -->
            <!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
                <!-- 文件名:log/demo.2017-12-05.0.log -->
                <fileNamePattern>${logPath}/log/catalina.out.%d{yyyy_MM_dd_HH}</fileNamePattern>
                <!-- 每产生一个日志文件,该日志文件的保存期限为30天 -->
                <maxHistory>30</maxHistory>
            </rollingPolicy>
            <encoder>
                <!-- pattern节点,用来设置日志的输入格式 -->
                <pattern>
                    %d %p [%t]  (%file:%line\): %m%n
                </pattern>
                <!-- 记录日志的编码:此处设置字符集 - -->
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    

    <File></Fille>推荐使用绝对路径,若是相对路径的话,本质上是相对于启动的bin目录。

    其中重要的是rollingPolicy的定义:
    <fileNamepattern>logback.%d{yyyy-MM-dd}.log</fileNamepattern>定义了日志的切分方式:按天将日志归档到一个文件中。

    同理:%d{yyyy_MM_dd_HH}来定义精确到小时的日志切分方式。

    <totalSizeCap>1GB</totalSizeCap>用来指定日志文件的上限大小,例如设置1GB的话,那么到了这个值,就会删除旧的日志。

    1. 如何设置日志级别,只输出Error日志

    <appender name="cleanLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
           <level>ERROR</level>
        </filter>
    </appender >
    

    2. 如何避免输出ERROR日志

    <appender name="cleanLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
           <level>ERROR</level>
           <!--匹配到ERROR级别就 禁止 输出--> 
           <onMatch>DENY</onMatch>
          <!--若不是ERROR 级别的就输出-->
           <onMismatch>ACCEPT</onMismatch>
        </filter>
    </appender >
    

    需要注意的是,只是避免输出ERROR级别的日志,若是只想输出INFO级别的,存在一些问题:因为不能排除WARN级别的日志。

    3. 如何只输出INFO级别的日志

    <filter class="ch.qos.logback.classic.filter.LevelFilter">
         <!--过滤 INFO-->
         <level>INFO</level>
         <!--匹配到INFO就允许-->
         <onMatch>ACCEPT</onMatch>
         <!--除INFO都禁止输出-->
         <onMismatch>DENY</onMismatch>
    </filter>
    

    子节点二:<root>

    root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。

    • level:用来设置打印级别,大小写无关,默认DEBUG。
     <root level="DEBUG">
          <appender-ref ref="STDOUT"/>
    </root>
    

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

    子节点三:<logger>

    <logger>用来设置一个包或者具体的某一个类的日志打印级别,以及指定<appender>。<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。

    • name:用来指定受此logger约束的某一个包或者具体的一个类。
    • level:用于设置打印级别。如果未设置此属性,那么当前logger将会继承上级级别。
    • addtivity:是否向上级logger传递打印信息,默认是true。
        <logger name="com.sxd.controller"/>
        <logger name="com.sxd.util.LogTestController" level="WARN" additivity="false">
            <appender-ref ref="console" />
        </logger>
    

    1. 带有logger配置,不指定级别level,不指定appender-ref

      <logger name="com.sxd.controller"/>
    

    因为没有设置addivity,默认为true,将该logger的打印信息向上传递。
    没有设置appender-ref,此logger不会打印任何信息。
    <root level="info">将root的打印级别设置为info,并且指定了appender-ref,那么将会在控制台和文件中打印。

    2.带有logger配置,指定级别level,指定appender-ref

     <logger name="com.sxd.util.LogTestController" level="WARN" additivity="false">
            <appender-ref ref="console" />
     </logger>
    

    打印级别是WRAN
    additivity属性是false,表示此logger的打印信息不再向上级传递。
    此时日志只会在控制台打印

    1. 若是additivity="true"的话,则会打印两次,因为打印信息会向上级传递,logger本身打印一次,root接着会打印一次,此时file中也会有日志。

    文件参考

    【spring boot】8.spring boot的日志框架logback使用

    相关文章

      网友评论

        本文标题:logback(一)—整合SpringBoot配置

        本文链接:https://www.haomeiwen.com/subject/oucscctx.html