SpringBoot 2.2.5 配置Logback打印日志,并自定义日志级别打印MyBatis的SQL语句,附带Lombok工具打印方法

说明

  1. 默认情况下,springboot项目使用logback来记录日志,并输出到控制台。实际开发中我们不需要直接添加logback日志依赖。 你会发现spring-boot-starter 其中包含了spring-boot-starter-logging,该依赖内容就是 springboot 默认的日志框架logback。
  2. 完整代码地址在结尾!!

第一步,自定义logback-custom.xml配置文件,并且放在 src/main/resources下

提示:根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载,本文直接自定义名字了,需要在application.yml文件中指定一下,后面会说到:

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

springboot官方推荐优先使用带有 -spring 的文件名作为你的日志配置(如比使用 logback-spring.xml ,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot可以为它添加一些spring boot特有的配置项。

logback-custom.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 此xml在spring-boot-1.5.3.RELEASE.jar里 -->
<!--    <include resource="org/springframework/boot/logging/logback/defaults.xml" />-->
<!--    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />-->
    <!-- 开启后可以通过jmx动态控制日志级别(springboot Admin的功能) -->
    <!--<jmxConfigurator/>-->
    <contextName>logback-custom</contextName>
    <!-- 定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
    <springProperty scope="context" name="LOG_HOME" source="log.file"/>

    <!-- 输出到控制台 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        encoders are assigned the type
        ch.qos.logback.classic.encoder.PatternLayoutEncoder by default
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- error日志 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <prudent>true</prudent>
        <append>true</append>
        <encoder>
            <pattern>%date [%level] [%thread] %logger{60} [%file : %line] %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 添加.gz 历史日志会启用压缩 大大缩小日志文件所占空间 -->
            <!--<fileNamePattern>/home/hfw-client/hfw_log/stdout.log.%d{yyyy-MM-dd}.log</fileNamePattern>-->
            <fileNamePattern>${LOG_HOME}/error/error-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>7</maxHistory><!--  保留7天日志 -->
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- file日志 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <prudent>true</prudent>
        <append>true</append>
        <encoder>
            <pattern>%date [%level] [%thread] %logger{60} [%file : %line] %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 添加.gz 历史日志会启用压缩 大大缩小日志文件所占空间 -->
            <!--<fileNamePattern>/home/hfw-client/hfw_log/stdout.log.%d{yyyy-MM-dd}.log</fileNamePattern>-->
            <fileNamePattern>${LOG_HOME}/file/file-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>7</maxHistory><!--  保留7天日志 -->
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <logger name= "fileLog" level="INFO" additivity="false">
        <appender-ref ref="FILE"/>
        <appender-ref ref="ERROR"/>
    </logger>

<!--    &lt;!&ndash; 设置包打印日志级别,例如把所有mapper文件的sql都出到控制台,还可以精确到某个类 &ndash;&gt;-->
<!--    <logger name= "com.luoyu.mapper.applymapper" level="TRACE" />-->
<!--    <logger name= "com.luoyu.mapper.shiromapper" level="TRACE" />-->

    <root level="info">
        <appender-ref ref="ERROR"/>
        <appender-ref ref="STDOUT"/>
    </root>

</configuration>

解释:

  1. <logger name= "com.luoyu.mapper.applymapper" level="TRACE" /> 此处name是扫描需要打印sql语句的mapper包,可配置多个,而level则是打印日志的级别,还可以精确到某个类。
  2. 级别分为:TRACE < DEBUG < INFO < WARN < ERROR < FATAL
  3. 只能展示大于或等于设置的日志级别的日志;也就是说springboot默认级别为INFO,那么在控制台展示的日志级别只有INFO 、WARN、ERROR、FATAL
  4. <springProperty scope="context" name="LOG_HOME" source="log.file"/>此处的log.file代表输入到日志文件的路径,需要在application.yml中配置,后面会说到

第二步,打开application.yml文件,新增以下配置

# 指定自定义命名的配置文件
logging:
  config: classpath:logback-custom.xml
# 打印日志统一根路径
log:
  file: D:/log

此时启动项目便可自动打印出mybatis的sql语句到控制台,需要指定mapper的包路径,也可以输出日志到文件中。后面还需要测试lombok的输出,单元测试最后给出。

第三步,代码里打印日志,在pom.xml文件中添加依赖,如下

<!-- 打印日志 @Slf4j 注解依赖 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.16</version>
</dependency>

第四步,IDEA添加lombok插件,选择file—>setting—>plugins,搜索lombok插件进行安装,不懂请自行百度

第五步,编写单元测试类,LogbackApplicationTests,并进行测试

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;

@Slf4j
// 获取启动类,加载配置,确定装载 Spring 程序的装载方法,它回去寻找 主配置启动类(被 @SpringBootApplication 注解的)
@SpringBootTest
class LogbackApplicationTests {

    private Logger fileLog = LoggerFactory.getLogger("fileLog");

    @Test
    void consoleLogTest() {
        log.info("测试输出到控制台");
    }

    @Test
    void fileLogTest() {
        fileLog.info("测试输出到日志文件");
    }

    @BeforeEach
    void testBefore(){
        log.info("测试开始!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    }

    @AfterEach
    void testAfter(){
        log.info("测试结束!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    }

}
  1. @Slf4j注解跟log.info配合使用,属于lombok工具方式输出,直接输出到控制台,调试的时候特别方便。另外一种fileLog.info会特定输出到指定的日志文件
  2. log.后面的方法名代表打印级别,包括log.trace(),log.debug(),log.info(),log.warn(),log.error()等方法

完整代码地址:https://github.com/Jinhx128/springboot-demo

注:此工程包含多个module,本文所用代码均在logback-demo模块下

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容