Springboot日志框架Logback的使用及配置

共 20251字,需浏览 41分钟

 ·

2021-03-14 18:20

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

两种配置方式

  • application.properties或 application.yml (系统层面)

  • logback-spring.xml(自定义文件方式)


第一种方式比较简单,可做的事情也比较简单,比如:只能配置日志文件的输出路径、日志文件的格式、日志的级别等


第二种方式比较复杂,对日志的处理比较好,生产上推荐这种,运行维护好。如有以下需求:

       1、区分 debug、info、error 等类型的日志,并分别输出到不同的日志文件。

      2、对日志文件进行维护,如每天产生一个日志文件,并设置日志文件的大小和保留天数等。

方式一:application.properties或 application.yml

#日志级别 trace<debug<info<warn<error<fatal,默认级别为info,即默认打印info及其以上级别的日志
#logging.level设置日志级别,后面跟生效的区域,比如root表示整个项目,也可以设置为某个包下,也可以具体到某个类名(日志级别的值不区分大小写)
#logging.level.root=info就是默认的情况
logging:
  pattern:  #配置日志输出格式
#    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} %clr(%-5level){green} %clr(${PID:- }){magenta} [ %clr(%thread){red}] --- %clr(%logger{36}){blue} : %msg%n"  #配置控制台的日志输出的格式,默认输出格式
    file: "%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} === - %msg%n"  #配置控制台的日志输出的格式
            #    日志输出格式:
            #      %d表示日期时间,
            #      %thread表示线程名,
            #      %-5level:级别从左显示5个字符宽度
            #      %logger{50} 表示logger名字最长50个字符,否则按照句点分割。
            #      %msg:日志消息,
            #      %n是换行符
            #      %clr(对项){颜色名} 配置该项的颜色  #只在控制台有作用
            #      ${PID:- }  进程号
            #      %d{yyyy-MM-dd HH:mm:ss.SSS} %clr(%-5level){green} %clr(${PID:- }){magenta} [ %clr(%thread){red}] --- %clr(%logger{36}){blue} : %msg%n  #系统默认配置

  file:   #配置日志输出的文件
    #这两个选一个配置就可以了,一起配置的话,name的生效。系统每次启动都会在原来的日志文件上追加数据
#    name: F:/ideaWorkSpace/spring-boot.log
    path: F:/ideaWorkSpace/log/   #会在log目录下生成一个spring.log的日志文件,相对路径为项目目录下

  level:  # 配置输出日志级别
    root: INFO  #设置整个项目的日志输出级别默认info
    com.bs.agricultural_share_platform.dao: DEBUG  # 设置该包下的日志输出级别为 DEBUG,输出执行的sql


该方式,日志都写在一个文件里面,不方便维护。



方式二:logback-spring.xml文件配置

在resources目录下添加logback-spring.xml配置文件

配置文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration debug="true">

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />

    <!-- 定义属性 -->
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <property name="log.path" value="F:/ideaWorkSpace/log" />

    <!-- 彩色日志格式 -->
    <!-- 控制台日志输出-->
    <property name="CONSOLE_LOG_PATTERN" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wex"/>
<!--    <property name="CONSOLE_LOG_PATTERN" value="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%-4level][%line][%thread] reqLog:[%X{reqLog}] call:[%logger][%method] parameter:%msg%n"/>-->
    <!-- 日志文件日志输出-->
    <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } --- [%t] %-40.40logger{39} : %m%n%wex"/>

    <!--多环境的日志输出-->
    <!--根据不同环境(prd:生产环境,test:测试环境,dev:开发环境)来定义不同的日志输出,-->
    <!--在 logback-spring.xml中使用 springProfile 节点来定义,方法如下:-->
    <springProfile name="prd">
        <property name="LOG_HOME" value="F:/ideaWorkSpace/log" />
    </springProfile>
    <springProfile name="test">
        <property name="LOG_HOME" value="F:/ideaWorkSpace/log" />
    </springProfile>
    <springProfile name="dev">
        <property name="LOG_HOME" value="F:/ideaWorkSpace/log" />
<!--        <logger name="com.bs.agricultural_share_platform.dao" level="debug"/>-->
    </springProfile>

    <!--
        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
        以及指定<appender>。<logger>仅有一个name属性,
        一个可选的level和一个可选的addtivity属性。
        name:用来指定受此logger约束的某一个包或者具体的某一个类。
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
              还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
              如果未设置此属性,那么当前logger将会继承上级的级别。
        addtivity:是否向上级logger传递打印信息。默认是true
    -->
    <!--
        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
        第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
        第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
     -->

    <!--
        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
        不能设置为INHERITED或者同义词NULL。默认是DEBUG
        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
    -->

    <!--输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!--            设置debug,在控制台输出执行的sql-->
            <level>debug</level>
        </filter>

        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!--debug 级别的日志-->
    <!-- 按照每天生成日志文件 -->
    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <!-- 正在记录的日志文件的路径及文件名,正在的 -->
        <file>${log.path}/log_debug.log</file>

        <!-- 设置此日志文件只记录debug级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <!--日志文件输出格式-->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>

        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <!--日志文件输出的文件名-->
            <fileNamePattern>${LOG_HOME}/info.%d{yyyy-MM-dd}.log</fileNamePattern>

            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>

        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!--info 级别的日志-->
    <!-- 按照每天生成日志文件 -->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <!-- 正在记录的日志文件的路径及文件名,正在的 -->
        <file>${log.path}/log_info.log</file>

        <!-- 设置此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <!--日志文件输出格式-->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>

        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <!--日志文件输出的文件名-->
            <fileNamePattern>${LOG_HOME}/info.%d{yyyy-MM-dd}.log</fileNamePattern>

            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>

        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!--WARN 级别的日志-->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <!-- 正在记录的日志文件的路径及文件名,正在的 -->
        <file>${log.path}/log_warn.log</file>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/warn.%d{yyyy-MM-dd}.log</fileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
    </appender>

    <!--ERROR 级别的日志-->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <!-- 正在记录的日志文件的路径及文件名,正在的 -->
        <file>${log.path}/log_error.log</file>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
    </appender>

    <!-- 系统日志输出级别 ,ref 的名字对应上面appender标签的name名称-->
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="INFO"/>
        <appender-ref ref="WARN"/>
        <appender-ref ref="ERROR"/>
        <appender-ref ref="DEBUG"/>
    </root>
</configuration>


Springboot会在目录下自动生成对应类型的日志文件:


其它问题

1、有些人配置文件里面有看到 layout(如下例子),不要慌,因为encoder 和 layout 在作用上没有本质区别,但是自0.9.19版本之后,极力推荐使用encoder。

2、为什么Spring Boot推荐使用logback-spring.xml来替代logback.xml来配置logback日志的问题分析?

原因是:logback.xml加载早于application.properties,所以如果你在logback.xml使用了变量时,而恰好这个变量是写在application.properties时,那么就会获取不到,只要改成logback-spring.xml就可以解决。

拓展:使用Slf4j输出日志

        1、添加依赖

<!-- Slf4j日志-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
        </dependency>


       2、Idea添加lombok插件


      3、添加注解并使用

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@MapperScan(basePackages = "com.bs.agricultural_share_platform.dao")
@Slf4j
public class AgriculturalSharePlatformApplication {

    public static void main(String[] args) {
        log.info("启动项目了");
        SpringApplication.run(AgriculturalSharePlatformApplication.class, args);
    }
}


————————————————

版权声明:本文为CSDN博主「浅议永久」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/weixin_41844824/article/details/114463474







粉丝福利:Java从入门到入土学习路线图

👇👇👇

👆长按上方微信二维码 2 秒


感谢点赞支持下哈 

浏览 68
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报