如何使用@Slf4j和logback-spring.xml搭建日志框架

 更新时间:2024年06月14日 08:43:01   作者:Cz范特西  
这篇文章主要介绍了如何使用@Slf4j和logback-spring.xml搭建日志框架问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

对于一名Java后端开发工程师,查询日志是经常做的事情。

因此,如果能构建一个合适的日志框架,就能让我们在查看日志排查错误的时候,能够很快地找出问题所在。

配置logback.xml,可以让idea的控制台输出我们想要的信息,比如时间、线程、端口、pid等等,还能配置不同信息不同颜色输出在控制台上,方便我们查看日志。

1、在yml配置文件中输入文件输出路径

此配置是logback.xml读取yml配置文件中的路径,使得文件能够输出到我们想要的地方。

在配置文件中配置是因为如果你使用Apollo这种可以热发布的配置中心,可以动态修改。

如果你输出的地址不变,可以直接写在logback.xml中。

log:
  path: ./logs/test-module/test-module-${server.port}
  • ./表示当前模块的路径
  • ${server.port}表示yml配置的模块端口

2、引入依赖

我一般使用的是@SLf4j作为日志输出。

使用logback.xml,需要引入下面两个依赖。

如果你使用的是springboot,那么springboot的starter会自带这两个依赖,不用再重复导入。

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.11</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.11</version>
</dependency>

3、在模块的resource目录下创建logback.xml

此份logback.xml,配置了控制台的输出日志写入文件的日志以及写入错误日志的配置。

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 {blue}表示前面的输出日志的颜色是蓝色 -->
    <property name="CONSOLE_LOG_PATTERN"
              value=" ${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){blue} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <!-- 获取yml中的log地址 -->
    <springProperty scope="context" name="logPath" source="log.path"/>

    <!-- 控制台彩色日志输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!--由文件大小与时间控制滚动-->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${logPath}/%d{yyyy-MM-dd}/logs-%d{yyyy-MM-dd}-%i.log</FileNamePattern>
            <!--活动文件大小-->
            <maxFileSize>20MB</maxFileSize>
            <!--回滚的总文件大小 eg:totalSizeCap/MaxFileSize 即只保存2个文件-->
            <totalSizeCap>2GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
            <!--最大的日志保存数量-->
            <!--<param name="MaxBackupIndex" value="10"/>-->
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期。%-5level:日志级别,从左显示5个字符宽度。%thread表示线程名,%c:表示日志所在类。%L:表示日志所在行数。 %msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%c] %L - %msg%n</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!--异常日志-->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <!--由文件大小与时间控制滚动-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <FileNamePattern>${logPath}/%d{yyyy-MM-dd}/errors-%d{yyyy-MM-dd}-%i.log</FileNamePattern>
            <maxFileSize>5MB</maxFileSize>
            <!--回滚的总文件大小 eg:totalSizeCap/MaxFileSize 即只保存2个文件-->
            <totalSizeCap>1GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
            <!--最大的日志保存数量-->
            <!--<param name="MaxBackupIndex" value="10"/>-->
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%c] %L - %msg%n</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

        <!--
		logger 有两种级别,一种是 root,一种是普通的 logger,logger 是用来设置某一个包或者具体的某一个类的日志打印机级别,以及制定的 appender。 
		logger 有三个属性
		- name:用来指定此 logger 约束的某一个包或者具体的某一个类
		- level:用来设置打印机别,
		- addtivity:是否向上级 logger 传递打印信息。默认是 true
		每个 logger 都有对应的父级关系,它通过包名来决定父级关系,root 是最高级的父元素。
        -->
    <logger name="com.czf" level="INFO"/>
    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="ERROR"/>
    </root>
</configuration>

注意

1、文件名需要为logback-spring.xml,如果是logback.xml的话,springboot会因为识别问题,会自动创建一个logPath_IS_UNDEFINED的文件夹。

2、如果想在启动类中加上日志,注意需要加在run方法的后面,否则虽然会在控制台输出,但不会写入到日志文件中。

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

至此,一个项目或模块的日志框架就搭建成功。

建议:多在代码中写日志,方便排查和后期维护。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java实现简单登录界面的实战过程

    java实现简单登录界面的实战过程

    学习JAVA的过程当中,登陆界面是多数人第一个实现的小程序,下面这篇文章主要给大家介绍了关于利用java实现简单登录界面的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • 深入浅出讲解Java比较器及数学常用类

    深入浅出讲解Java比较器及数学常用类

    这篇文章主要介绍了深入浅出讲解Java比较器及数学常用类,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • servlet的常见注册方式总结

    servlet的常见注册方式总结

    servlet大家都不陌生,当开发 Web 应用程序时,注册 Servlet 是一个常见的任务,本文将介绍一些常见的 Servlet 注册方法,希望对大家有所帮助
    2023-10-10
  • Java 数组复制clone方法实现详解

    Java 数组复制clone方法实现详解

    这篇文章主要介绍了Java 数组复制clone方法实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • java代码如何读取bootstrap.yml配置信息

    java代码如何读取bootstrap.yml配置信息

    这篇文章主要介绍了java代码如何读取bootstrap.yml配置信息问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 使用java批量写入环境变量的实现

    使用java批量写入环境变量的实现

    本文主要介绍了使用java批量写入环境变量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • Springboot如何解决前端请求跨域的问题

    Springboot如何解决前端请求跨域的问题

    这篇文章主要介绍了Springboot如何解决前端请求跨域的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java基础之类型封装器示例

    Java基础之类型封装器示例

    这篇文章主要介绍了Java基础之类型封装器,结合实例形式分析了java类型封装相关原理与操作技巧,需要的朋友可以参考下
    2019-08-08
  • 5种java排序算法汇总工具类

    5种java排序算法汇总工具类

    这篇文章主要总结了java的快速排序,希尔排序,插入排序,堆排序,归并排序五种排序算法,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Mybatis-Plus中Mapper的接口文件与xml文件相关的坑记录

    Mybatis-Plus中Mapper的接口文件与xml文件相关的坑记录

    这篇文章主要介绍了Mybatis-Plus中Mapper的接口文件与xml文件相关的坑记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论