spring boot 默认日志框架logback

spring boot 默认日志框架logback

spring boot默认使用logback作为日志框架

image-20231210213538837.png

Logback 和 Log4j 都是 Java 中常用的日志框架,而 Logback 实际上是 Log4j 的后继者,由 Log4j 的创始人 Ceki Gülcü 开发。Logback 旨在修复一些 Log4j 的设计缺陷并提供更好的性能。

一些主要的区别和改进包括:

  1. 性能优化: Logback 在性能上进行了一些优化,相对于 Log4j,它在一些方面可能表现更好。

  2. 配置简单: Logback 的配置相对简单,支持 Groovy 配置文件,相比 Log4j 更容易理解和配置。

  3. 内置实现: Logback 包含了 Log4j 的一些功能,并添加了一些新特性,如 SiftingAppender 和 TurboFilter。

尽管 Logback 是 Log4j 的后继者,但在实际项目中,选择使用哪个取决于项目的具体需求和个人偏好。在 Spring Boot 中,默认使用的是 Logback,但你也可以根据需要切换到其他日志框架。

下面说说springboot中的logback的简单配置与使用

1. 配置文件

默认情况下,springboot会自动加载logback-spring.xml或者logback.xml配置文件,只需要在类路径下添加该文件即可。

在resource目录下创建logback.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!--
configuration作为logback的根节点有以下属性
    scan: 默认为true, 配置文件发生变化, 将会被重新加载
    scanPeriod: 检测配置文件是否有修改的间隔时间,默认1分钟
    debug: 默认为false, true时会打印logback内部日志信息
    packagingData: 默认为false, true时, logback可以包含它输出的堆栈跟踪行的每一行的打包数据。打包数据由jar文件的名称和版本组成,而这个jar文件是由堆栈跟踪线的类产生的
-->
<configuration debug="false">
   
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="D://logs" />

    <!--
        appender: 有日志时, logback会将这个事件发送给appender
            filter;过滤器
            encoder:日志格式
            append:如果目标文件已存在, 是否追加到文件尾部, 默认为true, 否则清空文件
            rollingPolicy:如何滚动, 我们这是使用了TimeBasedRollingPolicy, 基于时间进行滚动
            triggeringPolicy: 何时滚动
    -->
    <!--
        rollingPolicy
            TimeBasedRollingPolicy: 基于时间进行滚动
                fileNamePattern: 文件路径
                maxHistory: 保留多长时间的日志
                totalSizeGap: 限制了日志文件的大小总共不能超过的大小
                cleanHistoryOnStart: 指定了是否重启应用的时候删除之前的归档日志
            SizeAndTimeBasedRollingPolicy: 策略除了具有 TimeBasedRollingPolicy 的功能外,还能限制单个日志文件的大小,当单个日志到达指定的大小时,触发日志滚动

    -->    

    <!--控制台 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!--只记录INFO级别的日志-->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--追加-->
        <append>true</append>

        <!--过滤器,只记录INFO级别的日志-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <fileNamePattern>${LOG_HOME}/test.%d{yyyy-MM-dd}-info.log</fileNamePattern>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder charset="UTF-8">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>

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

     <!--只记录WARN级别的日志-->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--追加-->
        <append>true</append>

        <!--过滤器,只记录WARN级别的日志-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <fileNamePattern>${LOG_HOME}/test.%d{yyyy-MM-dd}-warn.log</fileNamePattern>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder charset="UTF-8">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>

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

    <!--过滤器,只记录ERROR级别的日志-->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--追加-->
        <append>true</append>

        <!--过滤器,只记录ERROR级别的日志-->
        <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.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <fileNamePattern>${LOG_HOME}/test.%d{yyyy-MM-dd}-error.log</fileNamePattern>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder charset="UTF-8">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>

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


    <!-- 日志输出级别,INFO及以上的都会被输出 -->
    <root level="INFO">
        <!--输出到控制台,生产环境这个可以注释掉-->
        <appender-ref ref="CONSOLE"/>
        <!--保存到日志文件,测试这个可以注释掉-->
        <appender-ref ref="INFO" />
        <appender-ref ref="WARN" />
        <appender-ref ref="ERROR" />
    </root>

</configuration>

2.使用

配置完xml文件下便可以使用Logger来进行日志记录

// import org.slf4j.LoggerFactory;

@RestController
@RequestMapping("/test")
public class TestController {

    Logger logger = LoggerFactory.getLogger(TestController.class);
    @GetMapping
    public Result get(){
        System.out.println("执行业务方法");
        logger.info("业务方法执行成功");
        return new Result(200,"请求成功","这是data");
    }
}

3.注解式声明

每个类都需要声明日志变量比较麻烦,可以使用lombok插件,在maven中引入lombok依赖

<!-- 引入lombok -->
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

<!-- 打包时移除lombok -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

此时可以使用@Slf4j注解标注目标类,类中可以直接使用 变量log来使用日志记录,例如

// import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping
    public Result get(){
        System.out.println("执行业务方法");
        log.info("业务方法执行成功");
        return new Result(200,"请求成功","这是data");
    }
}

4.结果

日志文件:

image-20231210222128705.png

内容输出:

image-20231210222224379.png

5. 更正一点

在实际测试中发现了日志没有按天输出,只会append在同一个文件中,导致日志文件越来越大(例如11号的日志追加在10号的日志中,不会生成新的日志文件)
经查阅,是TimeBasedRollingPolicySizeBasedTriggeringPolicy冲突,如果想要按天生成日志,需要注释掉 SizeBasedTriggeringPolicy ,如

    <!--记录ERROR级别的日志-->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--追加-->
        <append>true</append>

        <!--过滤器,只记录ERROR级别的日志-->
        <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.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <fileNamePattern>${LOG_HOME}/test.%d{yyyy-MM-dd}-error.log</fileNamePattern>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder charset="UTF-8">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>

		<!--日志文件最大的大小-->
<!--        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
<!--            <MaxFileSize>2MB</MaxFileSize>-->
<!--        </triggeringPolicy>-->
    </appender>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值