如何設(shè)置springboot禁止日志輸出到控制臺
我們一個Spring Boot項(xiàng)目,使用了org.slf4j.Logger.info記錄日志。
類似代碼如下:
@Slf4j
public class CTest {
public void test() {
。。。
log.info("Hello World!");
}
}結(jié)果運(yùn)行的時候,系統(tǒng)除了將日志記錄到日志文件,還將日志打印到控制臺。由于日志太多太密集,屏幕不停地滾動,令人目不暇接,加上亂碼,簡直不知所謂。
為啥日志還會自動輸出到控制臺呢?我一向孤陋寡聞,好奇去問AI。AI告訴我,系統(tǒng)使用org.slf4j.Logger.info記錄日志,而SLF4J 只是一個日志門面(Facade),具體的日志記錄行為是由綁定的具體日志實(shí)現(xiàn)框架(如 Logback、Log4j、java.util.logging 等)決定的。就相當(dāng)于,org.slf4j.Logger.info只定義了日志的接口,具體實(shí)現(xiàn)要看用了什么日志工具包。如果沒有指定,Spring Boot會默認(rèn)采用Logback。
我看了看pom.xml,沒有發(fā)現(xiàn)有引用什么日志包,因此可以確定,我們系統(tǒng)用的應(yīng)該是Logback。
我記得Spring Boot的核心是控制反轉(zhuǎn)(IoC),AOP和容器,然后AI說,除此之外,還有約定大于配置,自動配置,起步依賴等等。
起步依賴就是為程序啟動自動提供了許多準(zhǔn)備,自動配置應(yīng)該就包含了上面說的,默認(rèn)采用Logback作為日志框架的做法。
一、禁止日志輸出到控制臺
回到日志內(nèi)容默認(rèn)輸出到控制臺,這是Logback的做派。如果要禁止,需要在配置文件或代碼中指定。
這個配置文件,不是指application.yml這種Spring Boot項(xiàng)目級的配置文件,它們只能簡單地設(shè)置日志的輸出級別和輸出路徑,而禁止輸出到控制臺,只能在專有的logback-spring.xml進(jìn)行配置。
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、也可以通過配置類進(jìn)行設(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最低。級別越高,記錄到日志的機(jī)會就越小。如果設(shè)為DEBUG,可能日志內(nèi)容會很多。
這是我另外一個項(xiàng)目中,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、運(yùn)行jar包的命令行、包括日志配置文件都設(shè)了UTF-8,但仍然是亂碼。但如果用System.out.println()直接輸出到控制臺,又正常。
這個問題暫時還沒有解決。記錄一下。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Security 使用 OncePerRequestFilter
OncePerRequestFilter是一個過濾器,每個請求都會執(zhí)行一次;一般開發(fā)中主要是做檢查是否已登錄、Token是否過期和授權(quán)等操作,而每個操作都是一個過濾器,下面介紹Spring Security 使用 OncePerRequestFilter 過濾器校驗(yàn)登錄過期、請求日志等操作方法,感興趣的朋友一起看看吧2024-06-06
項(xiàng)目總結(jié)之HttpURLConnection的disconnect的問題
這篇文章主要介紹了項(xiàng)目總結(jié)之HttpURLConnection的disconnect的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
淺談SpringBoot @Autowired的兩種注入方式
本文主要介紹了兩種SpringBoot @Autowired注入方式,具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
Mybatis利用OGNL表達(dá)式處理動態(tài)sql的方法教程
這篇文章主要給大家介紹了關(guān)于Mybatis利用OGNL表達(dá)式處理動態(tài)sql的方法教程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
SpringBoot實(shí)現(xiàn)EMQ設(shè)備的上下線告警
EMQX?的上下線系統(tǒng)消息通知功能在客戶端連接成功或者客戶端斷開連接,需要實(shí)現(xiàn)設(shè)備的上下線狀態(tài)監(jiān)控,所以本文給大家介紹了如何通過SpringBoot實(shí)現(xiàn)EMQ設(shè)備的上下線告警,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-10-10
Spring?Boot?使用?Disruptor?做內(nèi)部高性能消息隊(duì)列
這篇文章主要介紹了Spring?Boot?使用?Disruptor?做內(nèi)部高性能消息隊(duì)列,工作中遇到項(xiàng)目使用Disruptor做消息隊(duì)列,對你沒看錯,不是Kafka,也不是rabbitmq。Disruptor有個最大的優(yōu)點(diǎn)就是快,還有一點(diǎn)它是開源的哦,下面做個簡單的記錄2022-06-06
Spring Cloud Consul實(shí)現(xiàn)選舉機(jī)制的代碼工程
Spring Cloud Consul 是 Spring Cloud 提供的對 HashiCorp Consul 的支持,它是一種基于服務(wù)網(wǎng)格的工具,用于實(shí)現(xiàn)服務(wù)注冊、發(fā)現(xiàn)、配置管理和健康檢查,本文給大家介紹了如何用Spring Cloud Consul實(shí)現(xiàn)選舉機(jī)制,需要的朋友可以參考下2024-11-11

