使用SpringBoot2.0搭建企业级应用开发框架(四)配置LogBack日志

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

SpringBoot默认配置提供了对常用日志的支持,如:Java Util Logging、Log4J、Log4J2和Logback,每种Logger都可以通过配置使用控制台或者文件输出日志内容

Logback是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持slf4j,SpringBoot默认使用LogBack来记录日志,并用INFO级别输出到控制台

  • 配置

在com/resources/下创建LogBack配置文件logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--说明文档地址http://tengj.top/2017/04/05/springboot7/-->

<!--scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。-->
<!--scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。
    当scan为true时,此属性生效。默认的时间间隔为1分钟。-->
<!--debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <property name="appName" value="demo"></property>
    <property name="logPath" value="/applog/logs/demoApplication/"></property>
    <!-- 彩色日志格式 -->
    <property name="colorParttern" value="%d{HH:mm:ss.SSS} %contextName [%yellow(%thread)] %highlight(%-5level) %green(%logger){36} - %msg%n"></property>
    <property name="normalParttern" value="%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n"></property>
    <contextName>${appName}</contextName>

    <!--输出到控制台-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             &lt;!&ndash; 此appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息 &ndash;&gt;
             <level>DEBUG</level>
        </filter>-->
        <encoder>
            <pattern>${colorParttern}</pattern>
        </encoder>
    </appender>

    <!--INFO文件-->
    <appender name="info_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${logPath}/logback_info.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>${normalParttern}</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/logback-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </TimeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--WARN文件-->
    <appender name="warn_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${logPath}/logback_warn.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>${normalParttern}</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/logback-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </TimeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 此日志文件只记录warn级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--异常日志文件-->
    <appender name="error_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${logPath}/logback_error.log</file>
        <encoder>
            <pattern>${normalParttern}</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/logback-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </TimeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 只打印错误日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--root其实也是一个特殊的logger,用来指定最基础的日志输出级别,只有一个level属性
    不能设置为INHERITED或者同义词NULL,默认是DEBUG
    可以包含零个或多个元素,标识这个appender将会添加到这个logger-->
    <root level="INFO">
        <appender-ref ref="console" />
        <appender-ref ref="info_file" />
        <appender-ref ref="warn_file" />
        <appender-ref ref="error_file" />
    </root>

    <!--  <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender> -->
    <!-- name:用来指定受此logger约束的某一个包或者具体的某一个类 -->
    <!-- addtivity:是否向上级logger传递打印信息。默认是true -->
    <!--level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
        还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别
        如果未设置此属性,那么当前logger将会继承上级的级别
    -->
    <logger name="com.example.demo.mapper" level="DEBUG" additivity="false">
        <appender-ref ref="console"/>
    </logger>

</configuration>

彩色日志输出格式如果应用到文件输出中会造成乱码,所以在打印台中使用即可

关于配置的详解请参阅http://aub.iteye.com/blog/1101222

  • 日志使用理解

如果你有认真阅读理解关于logback配置的详解的话,就应该理解到:

1、appender 是一个打印工具,有具体的打印策略,需要接收日志的输入才能运行

2、logger 可以理解为一个日志筛选器,会从指定目录筛选符合自己设定级别的日志

3、root 是一个特殊的logger,与logger的区别在于它筛选的是全局而不是指定目录

以上三个都具有自己的级别设定,这个设定可以理解为过滤链,最终能通过的肯定负责最底层的筛选,即appender的级别设定,鉴于日志的灵活配置,建议使用方式为:

1、控制打印台的appender不进行级别设定

2、root默认info即可,如果为debug级别则会打印太多框架运行信息

3、由logger设定特殊的级别筛选进行自定义打印台输出

4、正式环境如不需要打印台信息,需要通过本系列的 多环境配置 将打印台相关logger与appender-ref注释掉

猜你喜欢

转载自blog.csdn.net/mxxrgxg/article/details/81288751