如何設(shè)置springboot禁止日志輸出到控制臺
我們一個Spring Boot項目,使用了org.slf4j.Logger.info記錄日志。
類似代碼如下:
@Slf4j
public class CTest {
public void test() {
。。。
log.info("Hello World!");
}
}結(jié)果運行的時候,系統(tǒng)除了將日志記錄到日志文件,還將日志打印到控制臺。由于日志太多太密集,屏幕不停地滾動,令人目不暇接,加上亂碼,簡直不知所謂。
為啥日志還會自動輸出到控制臺呢?我一向孤陋寡聞,好奇去問AI。AI告訴我,系統(tǒng)使用org.slf4j.Logger.info記錄日志,而SLF4J 只是一個日志門面(Facade),具體的日志記錄行為是由綁定的具體日志實現(xiàn)框架(如 Logback、Log4j、java.util.logging 等)決定的。就相當(dāng)于,org.slf4j.Logger.info只定義了日志的接口,具體實現(xiàn)要看用了什么日志工具包。如果沒有指定,Spring Boot會默認采用Logback。
我看了看pom.xml,沒有發(fā)現(xiàn)有引用什么日志包,因此可以確定,我們系統(tǒng)用的應(yīng)該是Logback。
我記得Spring Boot的核心是控制反轉(zhuǎn)(IoC),AOP和容器,然后AI說,除此之外,還有約定大于配置,自動配置,起步依賴等等。
起步依賴就是為程序啟動自動提供了許多準(zhǔn)備,自動配置應(yīng)該就包含了上面說的,默認采用Logback作為日志框架的做法。
一、禁止日志輸出到控制臺
回到日志內(nèi)容默認輸出到控制臺,這是Logback的做派。如果要禁止,需要在配置文件或代碼中指定。
這個配置文件,不是指application.yml這種Spring Boot項目級的配置文件,它們只能簡單地設(shè)置日志的輸出級別和輸出路徑,而禁止輸出到控制臺,只能在專有的logback-spring.xml進行配置。
1、application.yml只能簡單地設(shè)置日志的輸出級別和輸出路徑
application.yml
logging:
level:
root: info # 設(shè)置全局日志級別
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設(shè)置
logback-spring.xml需要手動創(chuàng)建,位置也是在resources根目錄下,SpringBoot會自動識別。
文件內(nèi)容如下:
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、也可以通過配置類進行設(shè)置
當(dāng)然也可以通過創(chuàng)建配置類來設(shè)置:
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) {
// 創(chuàng)建 FileAppender
FileAppender<ILoggingEvent> fileAppender = new FileAppender<>();
fileAppender.setContext(context);
fileAppender.setFile("./log/seller.log");
// 設(shè)置日志輸出格式
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);
}
}
二、設(shè)置日志輸出級別
Logback的日志輸出有所謂級別:Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7
其中FATAL最高,DEBUG最低。級別越高,記錄到日志的機會就越小。如果設(shè)為DEBUG,可能日志內(nèi)容會很多。
這是我另外一個項目中,resources/logback-spring.xml的部分內(nèi)容
<?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>三、日志輸出到控制臺亂碼問題
我發(fā)現(xiàn),日志內(nèi)容輸出到控制臺,其中的漢字會是亂碼。IDE、運行jar包的命令行、包括日志配置文件都設(shè)了UTF-8,但仍然是亂碼。但如果用System.out.println()直接輸出到控制臺,又正常。
這個問題暫時還沒有解決。記錄一下。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于File與MultipartFile的用法概述
這篇文章主要介紹了關(guān)于File與MultipartFile的用法概述,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
SpringBoot?實現(xiàn)全局異常處理的示例代碼
本文主要介紹了SpringBoot實現(xiàn)全局異常處理,全局異常處理器的使用可以顯著提高Spring Boot項目的代碼質(zhì)量和可維護性,減少冗余代碼,具有一定的參考價值,感興趣的可以了解一下2024-06-06
Springboot如何使用Aspectj實現(xiàn)AOP面向切面編程
這篇文章主要介紹了Springboot如何使用Aspectj實現(xiàn)AOP面向切面編程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
java8 forEach結(jié)合Lambda表達式遍歷 List操作
這篇文章主要介紹了java8 forEach結(jié)合Lambda表達式遍歷 List操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09

