如何設(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說,除此之外,還有約定大于配置,自動配置,起步依賴等等。
起步依賴就是為程序啟動自動提供了許多準備,自動配置應(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-09SpringBoot?實現(xiàn)全局異常處理的示例代碼
本文主要介紹了SpringBoot實現(xiàn)全局異常處理,全局異常處理器的使用可以顯著提高Spring Boot項目的代碼質(zhì)量和可維護性,減少冗余代碼,具有一定的參考價值,感興趣的可以了解一下2024-06-06Springboot如何使用Aspectj實現(xiàn)AOP面向切面編程
這篇文章主要介紹了Springboot如何使用Aspectj實現(xiàn)AOP面向切面編程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01java8 forEach結(jié)合Lambda表達式遍歷 List操作
這篇文章主要介紹了java8 forEach結(jié)合Lambda表達式遍歷 List操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09