设置spring boot禁止日志输出到控制台

我们一个Spring Boot项目,使用了org.slf4j.Logger.info记录日志。类似代码如下:

java 复制代码
@Slf4j
public class CTest {
    public void test() {
    	。。。
        log.info("Hello World!");
    }
}

结果运行的时候,系统除了将日志记录到日志文件,还将日志打印到控制台。由于日志太多太密集,屏幕不停地滚动,令人目不暇接,加上乱码,简直不知所谓。

为啥日志还会自动输出到控制台呢?我一向孤陋寡闻,好奇去问AI。AI告诉我,系统使用org.slf4j.Logger.info记录日志,而SLF4J 只是一个日志门面(Facade),具体的日志记录行为是由绑定的具体日志实现框架(如 Logback、Log4j、java.util.logging 等)决定的。就相当于,org.slf4j.Logger.info只定义了日志的接口,具体实现要看用了什么日志工具包。如果没有指定,Spring Boot会默认采用Logback。我看了看pom.xml,没有发现有引用什么日志包,因此可以确定,我们系统用的应该是Logback。我记得Spring Boot的核心是控制反转(IoC),AOP和容器,然后AI说,除此之外,还有约定大于配置,自动配置,起步依赖等等。起步依赖就是为程序启动自动提供了许多准备,自动配置应该就包含了上面说的,默认采用Logback作为日志框架的做法。

一、禁止日志输出到控制台

回到日志内容默认输出到控制台,这是Logback的做派。如果要禁止,需要在配置文件或代码中指定。这个配置文件,不是指application.yml这种Spring Boot项目级的配置文件,它们只能简单地设置日志的输出级别和输出路径,而禁止输出到控制台,只能在专有的logback-spring.xml进行配置。

1、application.yml只能简单地设置日志的输出级别和输出路径

application.yml

js 复制代码
logging:
  level:
    root: info      # 设置全局日志级别
    com.yourpackage: debug  # 针对特定包的日志级别
  file:
    path: ./log/seller.log  # 日志输出路径
  pattern:
    file: '%d{yyyy-MM-dd HH:mm:ss} - %msg%n'  # 日志文件的格式
    console: '%d{yyyy-MM-dd HH:mm:ss} - %msg%n'  # 控制台输出的日志格式

2、日志配置文件logback-spring.xml设置

logback-spring.xml需要手动创建,位置也是在resources根目录下,SpringBoot会自动识别。文件内容如下:

resources/logback-spring.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 定义文件日志输出 -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>./log/seller.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 配置 root 只使用文件输出 -->
    <root level="info">
        <appender-ref ref="FILE" />
    </root>
</configuration>

3、也可以通过配置类进行设置

当然也可以通过创建配置类来设置:

java 复制代码
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ch.qos.logback.classic.spi.ILoggingEvent;
import java.util.Iterator;

@Configuration
public class LoggingConfig {

    @Bean
    public void configureLogging() {
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
        Logger rootLogger = loggerContext.getLogger("ROOT");

        // 移除 ConsoleAppender
        removeConsoleAppender(rootLogger);

        // 添加 FileAppender
        addFileAppender(loggerContext, rootLogger);
    }

    private void removeConsoleAppender(Logger rootLogger) {
        Iterator<Appender<ILoggingEvent>> iterator = rootLogger.iteratorForAppenders();
        while (iterator.hasNext()) {
            Appender<ILoggingEvent> appender = iterator.next();
            if (appender instanceof ConsoleAppender) {
                rootLogger.detachAppender(appender);
                appender.stop();
            }
        }
    }

    private void addFileAppender(LoggerContext context, Logger rootLogger) {
        // 创建 FileAppender
        FileAppender<ILoggingEvent> fileAppender = new FileAppender<>();
        fileAppender.setContext(context);
        fileAppender.setFile("./log/seller.log");

        // 设置日志输出格式
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setContext(context);
        encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss} - %msg%n");
        encoder.start();

        fileAppender.setEncoder(encoder);
        fileAppender.start();

        // 添加到 rootLogger
        rootLogger.addAppender(fileAppender);
    }
}

二、设置日志输出级别

Logback的日志输出有所谓级别:Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7

其中FATAL最高,DEBUG最低。级别越高,记录到日志的机会就越小。如果设为DEBUG,可能日志内容会很多。

这是我另外一个项目中,resources/logback-spring.xml的部分内容

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false">
	。。。
    <!-- Level: FATAL 0  ERROR 3  WARN 4  INFO 6  DEBUG 7 -->
    <root level="warn">
        <appender-ref ref="console"/>
        <appender-ref ref="debug"/>
        <appender-ref ref="error"/>
    </root>
</configuration>

三、日志输出到控制台乱码问题

我发现,日志内容输出到控制台,其中的汉字会是乱码。IDE、运行jar包的命令行、包括日志配置文件都设了UTF-8,但仍然是乱码。但如果用System.out.println()直接输出到控制台,又正常。这个问题暂时还没有解决。

记录一下。

相关推荐
番茄Salad2 小时前
Spring Boot临时解决循环依赖注入问题
java·spring boot·spring cloud
用户21411832636022 小时前
OpenSpec 实战:用规范驱动开发破解 AI 编程协作难题
后端
Olrookie3 小时前
若依前后端分离版学习笔记(二十)——实现滑块验证码(vue3)
java·前端·笔记·后端·学习·vue·ruoyi
LucianaiB3 小时前
招聘可以AI面试,那么我制作了一个AI面试教练不过分吧
后端
无奈何杨4 小时前
CoolGuard更新,ip2region升级、名单增加过期时间
后端
摇滚侠5 小时前
Spring Boot 3零基础教程,WEB 开发 自定义静态资源目录 笔记31
spring boot·笔记·后端·spring
摇滚侠5 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 遍历 笔记40
spring boot·笔记·thymeleaf
Anthony_49265 小时前
逻辑清晰地梳理Golang Context
后端·go
Github项目推荐5 小时前
你的错误处理一团糟-是时候修复它了-🛠️
前端·后端
进击的圆儿5 小时前
高并发内存池项目开发记录01
后端