java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > @Slf4j和logback-spring.xml搭建日志框架

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

作者: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}

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("项目启动");
    }

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

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

总结

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

您可能感兴趣的文章:
阅读全文