Springboot整合logback实战

logback简介

Logback:是由 log4j 创始人设计的一个开源日志组件。相比于log4j,Logback重写了内核,在一些关键执行路径上性能提升很多。而且logback不仅性能提升了,初始化内存加载也更小。

  • Logback官网:https://logback.qos.ch/
  • Logback文档:https://logback.qos.ch/documentation.html

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

Springboot 默认日志Logback

Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每种Logger都可以通过配置使用控制台或者文件输出日志内容。默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。
Spring Boot项目在引入spring-boot-starter依赖时,其中默认已包含了spring-boot-starter-logging,所以不需要重复导入slf4j-api、logback-classic、logback-core等依赖。在新建项目中我们可以ctrl 左键点进去看一下就知道了。
Springboot整合logback实战_第1张图片
Springboot整合logback实战_第2张图片
Springboot整合logback实战_第3张图片
Springboot整合logback实战_第4张图片
可以看到Springboot是已经整合了相关依赖,如果手动引入也没错,但是没必要重复引入依赖。

日志输出级别

TRACE < DEBUG < INFO < WARN < ERROR < FATAL。

如果设置为 WARN ,则低于 WARN 的信息都不会输出。
Spring Boot中默认配置ERROR、WARN和INFO级别的日志输出到控制台。
您还可以通过启动您的应用程序 —debug 标志来启用“调试”模式(开发的时候推荐开启 )
在运行命令后加入—debug标志,如:$ java -jar argusTest.jar —debug
在application.properties中配置debug=true,该属性置为true的时候,核心Logger(包含嵌入式容器、hibernate、spring)会输出更多内容,但是你自己应用的日志并不会输出为DEBUG级别。
默认情况下,Springboot将日志输出到控制台,不会写到日志文件。如果要编写除控制台输出之外的日志文件,则需在spring配置文件application.properties中设置logging.file或logging.path属性。
Springboot整合logback支持俩种方式设置logback相关属性,一种通过配置文件设置属性,一种通过自定义配置xml文件(logback相关属性详细可以参考官网,接下里重点讲第二种,配置灵活简单易实用)。

自定义文件配置

SpringBoot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),当然Springboot肯定不会随意规定,使用logback-spring.xml命名的配置文件我们可以使用pring boot特有的配置项,比如使用springProfile配置,不需要logging.config指定不同环境使用不同配置文件。
Springboot强大之处就是整合各种相关框架依赖,方便我们快速构建项目,如果使用其他日志框架我们也只需要按规则命名就可(前体是将配置文件放在项目resources目录下)。根据不同的日志系统,你可以按如下规则组织配置文件名,都能被正确加载.

Logback:logback-spring.xml, logback.xml Log4j:log4j-spring.properties,
log4j-spring.xml, log4j.properties, log4j.xml
Log4j2:log4j2-spring.xml, log4j2.xml JDK (Java Util
Logging):logging.properties

当我们按照规则来命名相关配置文件时,spring会自动到resources目录下加载配置文件,在application.properties中我们无需指定配置文件。如果你又不想用logback.xml或者logback-spring.xml作为Logback配置的名字,可以通过logging.config属性指定自定义的名字

logging.config=classpath:xxxx.xml

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds" debug="false">
    <property name="LOG_PATH" value="E:/panbo/logs/aqs"/>
    <property name="LOG_FILE_ERROR" value="E:/panbo/logs/aqs/error"/>
    <property name="LOG_FILE_INFO" value="E:/panbo/logs/aqs/info"/>
    <property name="LOG_NAME" value="aqs"/>

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} [%clr(%thread){yellow}] %clr(%-5level){blue} %clr(%logger{36}){cyan} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
    <property name="CONSOLE_LOG_PATTERN_NO_COLOR"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!--    不想配置彩色输出格式,可以使用下面的正常日志输出格式 原理一样-->
<!--    <property name="LOG_STDOUT_PATTERN"-->
<!--              value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>-->
<!--    <property name="LOG_FILE_PATTERN"-->
<!--              value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>-->
    <!-- 输出到控制台 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 输出的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
<!--        自定义日志过滤器 有需要的时候可以自己定义-->
<!--        <filter class="com.argus.aqs.config.MyLogBackFilter"/>-->
    </appender>

<!--     按照每天生成常规日志文件-->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_FILE_ERROR}/${LOG_NAME}-error.log</file>
        <!-- 基于时间的分包策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE_ERROR}/${LOG_NAME}-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <!--保留时间,单位:-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>100MB</MaxFileSize>
        </triggeringPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_FILE_INFO}/${LOG_NAME}-info.log</file>
        <!-- 基于时间的分包策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE_INFO}/${LOG_NAME}-info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <!--保留时间,单位:-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 按照每天生成常规日志文件 -->
    <appender name="ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${LOG_NAME}.log</file>
        <!-- 基于时间的分包策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${LOG_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <!--保留时间,单位:-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 指定相关包下的日志打印级别 不设置级别将继承上级日志级别 -->
<!--    <logger name="com.ulisesbocchio" level="INFO"/>-->
<!--    <logger name="com.netflix" level="INFO"/>-->
<!--    <logger name="com.zaxxer.hikari" level="INFO"/>-->
<!--    <logger name="com.baomidou" level="INFO"/>-->
<!--    <logger name="org" level="INFO"/>-->
<!--    <logger name="_org" level="INFO"/>-->
<!--    <logger name="io" level="INFO"/>-->

<!--    <root level="INFO">-->
<!--        <appender-ref ref="CONSOLE"/>-->
<!--        <appender-ref ref="ALL"/>-->
<!--        <appender-ref ref="ERROR"/>-->
<!--        <appender-ref ref="INFO"/>-->
<!--    </root>-->
<!--    使用spring的springProfile 定义多环境输出模式-->
    <!-- 开发环境下的日志配置 -->
    <springProfile name="dev">
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="ERROR" />
            <appender-ref ref="INFO" />
            <appender-ref ref="ALL" />
        </root>
    </springProfile>

    <springProfile name="test">
        <root level="INFO">
            <appender-ref ref="ERROR" />
            <appender-ref ref="INFO" />
            <appender-ref ref="ALL" />
        </root>
    </springProfile>

    <springProfile name="prod">
        <root level="INFO">
            <appender-ref ref="ERROR" />
            <appender-ref ref="INFO" />
            <appender-ref ref="ALL" />
        </root>
    </springProfile>

</configuration>

开箱即用,无需额外的配置属性。配置文件中的属性都有相关注释,需要其他配置功能的可以看出logback官网相关属性配置添加即可。

配置文件属性

针对logback-spring.xml文件中属性简单说明
configuration根节点,器下有5个子属性

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

Springboot整合logback实战_第5张图片

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

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

  3. appender:appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。我们可以设置多个策略,比如控制台输出
    ConsoleAppender、文件输出RollingFileAppender。

    	encoder表示对日志进行编码
    		%d{HH: mm:ss.SSS}——日志输出时间
    		%thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
    		%-5level——日志级别,并且使用5个字符靠左对齐
    		%logger{36}——日志输出者的名字
    		%msg——日志消息
    		%n——平台的换行符
    	filter :日志控制过滤,这里我们自定义过滤器,过滤日志规则,也可以使用自带的
    	过滤规则LevelFilter
    

在RollingFileAppender中最重要的就是rollingPolicy,定义了日志的切分方式——把每一天的日志归档到一个文件中。
RollingFileAppender提供了俩种轮转策略:SizeAndTimeBasedRollingPolicy 基于大小以及时间的轮转策略。TimeBasedRollingPolicy 是最常用的轮转策略。它是基于时间来定义轮转策略。
Springboot整合logback实战_第6张图片
任何斜杆或者反斜杠够会被当作文件夹分隔符。任何必要的文件夹都会在有需要的时候创建。你可以轻松的将日志文件放在单独的文件夹中。TimeBasedRollingPolicy 支持文件自动压缩。如果 fileNamePattern 以 .gz 或者 .zip结尾,将会启动这个特性。

  1. logger:用来设置某一个包或者具体的某一个类的日志打印级别、以及指定appender。logger仅有一个name属性,一个可选的level和一个可选的additivity属性。
  • name 用来指定受此loger约束的某一个包或者具体的某一个类。
  • level 用来设置打印级别,大小写无关如果未设置此属性,那么当前logger将会继承上级的级别。
  • additivity 是否向上级logger传递打印信息。默认是true。false:表示只用当前logger的appender-ref。true:表示当前logger的appender-ref和rootLogger的appender-ref都有效。

有一点要注意,在自身指定了appender下,并且additivity 设定为true,就会打印两次,因为打印信息向上级传递,logger本身打印一次,root接到后又打印一次。

  1. root:root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性,以包含零个或多个元素,标识这个appender将会添加到这个loger。

多环境日志输出

据不同环境(prod:生产环境,test:测试环境,dev:开发环境)来定义不同的日志输出,在 logback-spring.xml中使用 springProfile 节点来定义。这里用到了Springboot的springProfile配置,所以配置文件名称必须logback-spring.xml。
Springboot整合logback实战_第7张图片
这样不管开发环境还是测试环境、生产环境我们都无需修改配置文件,只要修改springboot配置文件的profiles.active属性
Springboot整合logback实战_第8张图片

总结

到处Springboot logback日志打印配置就结束了,springboot帮我们整合了这些日志框架,所以上手还是不难的,相关的节点、属性大家可以参考logback官方文档,配置出我们业务所需要的日志管理,希望能帮助到大家。以下是项目运行后的日志。
Springboot整合logback实战_第9张图片
Springboot整合logback实战_第10张图片
Springboot整合logback实战_第11张图片
logback支持灵活的日志文件输出,有洁癖、强迫症的同学们可以选择自己想要的位置输出。

你可能感兴趣的:(Spring,spring,boot,logback,log4j)