You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

SpringBoot中通过配置控制日志级别并在方法中写入日志文件

解决SpringBoot日志写入文件及环境变量级别控制问题

别着急,咱们一步步拆解你的问题,从配置到代码逐一优化,就能解决日志写入和级别控制的需求了:

一、修复Logback配置,让日志成功写入文件

你的logback.xml已经定义了文件输出的FILE Appender,但根日志节点只关联了控制台输出的STDOUT,这就是日志文件只有启动时生成却没有内容的核心原因。另外,咱们可以直接在Logback里读取环境变量,不用通过application.properties中转,更简洁直接。

修改后的logback.xml配置:

<configuration>
    <!-- 读取环境变量BWS_LOG_LEVEL,若未设置则默认使用debug级别 -->
    <property name="LOG_LEVEL" value="${BWS_LOG_LEVEL:-debug}"/>

    <!-- 文件输出Appender配置 -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${user.home}/bws.log</file>
        <append>false</append> <!-- 启动时覆盖旧日志,需要追加的话改为true -->
        <encoder>
            <pattern>%-5relative %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 控制台输出Appender配置 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 根日志级别关联环境变量,同时绑定文件和控制台输出 -->
    <root level="${LOG_LEVEL}">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/> <!-- 新增这行,让日志写入文件 -->
    </root>
</configuration>

二、优化日志工具类代码

你的Logs类存在两个小问题:一是静态变量的@Value注入方式不符合Spring规则,无法生效;二是不需要手动维护日志级别变量,SLF4J+Logback会自动根据配置的级别过滤日志。

修改后的Logs类:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class Logs {
    // 直接初始化Logger实例
    private static final Logger logger = LoggerFactory.getLogger(Logs.class);

    // 对外提供的日志方法
    public static void totalAlunos(int al) {
        // 用占位符拼接日志内容,比字符串拼接更高效规范
        logger.debug("Total de alunos no banco de dados: {}", al);
        // 日志格式里的%logger{36}会自动输出当前类名,无需手动添加
    }
}

关键说明:

  • 去掉了自定义的myLevelLog变量,Logback会根据环境变量配置的级别自动控制日志输出(比如环境变量设为info时,debug级别的日志会被过滤)
  • 使用{}占位符处理动态参数,是SLF4J的推荐写法,避免字符串拼接的性能损耗

三、验证效果

  1. 设置环境变量BWS_LOG_LEVEL,比如设为debuginfo
  2. 启动SpringBoot应用,调用Logs.totalAlunos(100)这类方法
  3. 打开${user.home}/bws.log文件,就能看到对应的日志内容了

内容的提问来源于stack exchange,提问作者Manzini

火山引擎 最新活动