如何设置springboot禁止日志输出到控制台
作者:左直拳
我们一个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()直接输出到控制台,又正常。
这个问题暂时还没有解决。记录一下。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。