如何设置springboot禁止日志输出到控制台

 更新时间:2025年01月14日 14:26:19   作者:左直拳  
文章总结:本文主要介绍了SpringBoot项目中使用SLF4J记录日志时,日志默认输出到控制台的原因及解决方法,日志框架如Logback默认会将日志输出到控制台,可以通过`logback-spring.xml`配置文件或配置类来禁止日志输出到控制台,并设置日志输出级别

我们一个Spring Boot项目,使用了org.slf4j.Logger.info记录日志。

类似代码如下:

@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

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 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、也可以通过配置类进行设置

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

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 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()直接输出到控制台,又正常。

这个问题暂时还没有解决。记录一下。

总结

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

相关文章

  • Spring Security 使用 OncePerRequestFilter 过滤器校验登录过期、请求日志等操作

    Spring Security 使用 OncePerRequestFilter 

    OncePerRequestFilter是一个过滤器,每个请求都会执行一次;一般开发中主要是做检查是否已登录、Token是否过期和授权等操作,而每个操作都是一个过滤器,下面介绍Spring Security 使用 OncePerRequestFilter 过滤器校验登录过期、请求日志等操作方法,感兴趣的朋友一起看看吧
    2024-06-06
  • 项目总结之HttpURLConnection的disconnect的问题

    项目总结之HttpURLConnection的disconnect的问题

    这篇文章主要介绍了项目总结之HttpURLConnection的disconnect的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • javacv依赖太大导致jar包也大的解决办法

    javacv依赖太大导致jar包也大的解决办法

    随着项目的复杂度和依赖关系的增加,打包后的JAR包可能会变得很大,这篇文章主要介绍了javacv依赖太大导致jar包也大的解决办法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-09-09
  • 一篇文章带你入门Java运算符

    一篇文章带你入门Java运算符

    这篇文章主要介绍了Java基本数据类型和运算符,结合实例形式详细分析了java基本数据类型、数据类型转换、算术运算符、逻辑运算符等相关原理与操作技巧,需要的朋友可以参考下
    2021-08-08
  • JavaWeb文件上传开发实例

    JavaWeb文件上传开发实例

    这篇文章主要为大家详细介绍了JavaWeb文件上传开发实例,如何进行文件上传操作,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 浅谈SpringBoot @Autowired的两种注入方式

    浅谈SpringBoot @Autowired的两种注入方式

    本文主要介绍了两种SpringBoot @Autowired注入方式,具有一定的参考价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • Mybatis利用OGNL表达式处理动态sql的方法教程

    Mybatis利用OGNL表达式处理动态sql的方法教程

    这篇文章主要给大家介绍了关于Mybatis利用OGNL表达式处理动态sql的方法教程的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-06-06
  • SpringBoot实现EMQ设备的上下线告警

    SpringBoot实现EMQ设备的上下线告警

    EMQX 的上下线系统消息通知功能在客户端连接成功或者客户端断开连接,需要实现设备的上下线状态监控,所以本文给大家介绍了如何通过SpringBoot实现EMQ设备的上下线告警,文中有详细的代码示例,需要的朋友可以参考下
    2023-10-10
  • Spring Boot 使用 Disruptor 做内部高性能消息队列

    Spring Boot 使用 Disruptor 做内部高性能消息队列

    这篇文章主要介绍了Spring Boot 使用 Disruptor 做内部高性能消息队列,工作中遇到项目使用Disruptor做消息队列,对你没看错,不是Kafka,也不是rabbitmq。Disruptor有个最大的优点就是快,还有一点它是开源的哦,下面做个简单的记录
    2022-06-06
  • Spring Cloud Consul实现选举机制的代码工程

    Spring Cloud Consul实现选举机制的代码工程

    Spring Cloud Consul 是 Spring Cloud 提供的对 HashiCorp Consul 的支持,它是一种基于服务网格的工具,用于实现服务注册、发现、配置管理和健康检查,本文给大家介绍了如何用Spring Cloud Consul实现选举机制,需要的朋友可以参考下
    2024-11-11

最新评论