Spring?Boot日志SLF4J和Logback示例詳解
日志的分類
SpringBoot中的日志庫分為兩種:
- 實現(xiàn)庫:提供具體的日志實現(xiàn),例如日志級別的控制、打印格式、輸出目標等。
- 外觀庫:自身不提供日志實現(xiàn),而是對其他日志庫進行封裝,從而方便使用?;谕庥^模式實現(xiàn)。
關(guān)于外觀庫的出現(xiàn),可設(shè)想一下:現(xiàn)在有多種日志庫,每一種接口都不同。于是我們在不同項目中往往需要調(diào)用不同的API。于是希望,無論哪一種日志庫,我們都在外面套一層殼,使用時調(diào)用這層殼的接口,這樣就統(tǒng)一了。這層殼就是外觀庫。
對于這兩種庫,常見的有:
- 實現(xiàn)庫:
Log4j、Log4j2、Logback - 外觀庫:
Slf4j、Apache Commons Logging
通常只需要引入Slf4j依賴,然后通過Slf4j來調(diào)用Logback或Log4j。
對應地,配置文件除了對Slf4j進行配置,也可以對Logback或Log4j進行配置。
Logback相比于Log4j,性能提高了10倍以上的性能,占用的內(nèi)存也變小了,并且文檔十分詳細。推薦使用Slf4j+Logback。
官網(wǎng):
官方文檔:
Slf4j、Logback和Log4j是同一個作者,使用了相同的設(shè)計,因此Slf4j直接可調(diào)用Logback和Log4j。而對于其他日志實現(xiàn)庫,例如java.util.logging等,需要使用一個適配器模塊來將Apache Commons Logging的接口轉(zhuǎn)換為Slf4j的可調(diào)用接口。
Spring Boot日志
依賴
Spring Boot默認使用Logback。只需要引入spring-boot-starter或spring-boot-starter-web就會默認包含,不需要再單獨引入。lombok中默認包含了Slf4j,因此只要引入了lombok就無需再單獨引入Slf4j:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>日志對象
要打印,就要先獲取日志對象。
通常地,使用Slf4j包中的LoggerFactory來得到日志對象,然后打?。?/p>
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LoggerController {
// 得到日志對象
private Logger logger = LoggerFactory.getLogger(LoggerController.class);
@RequestMapping("/logger")
public String logger() {
// 日志打印
logger.trace("日志級別: trace");
logger.debug("日志級別: debug");
logger.info("日志級別: info");
logger.warn("日志級別: warn");
logger.error("日志級別: error");
return "logger";
}
}如果項目中引入了lombok組件,則可在類前添加@Slf4j注解,這樣就可在類中直接使用log日志對象,而無需通過LoggerFactory來獲取。
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j // 通過lombok的`@Slf4j`得到日志實例
public class LoggerController {
@RequestMapping("/logger")
public String logger() {
// 日志打印
log.trace("日志級別: trace");
log.debug("日志級別: debug");
log.info("日志級別: info");
log.warn("日志級別: warn");
log.error("日志級別: error");
return "logger";
}
}日志級別及配置
日志級別
日志有8個級別:
- ALL: 開啟所有日志
- TRACE: 追蹤,程序每次執(zhí)行一步都輸出。級別較低,通常不會使用
- DEBUG: 調(diào)試日志,細粒度
- INFO: 普通日志,粗粒度
- WARN: 警告日志
- ERROR: 錯誤日志,但不影響系統(tǒng)同運行
- FATAL: 嚴重錯誤日志,會導致系統(tǒng)退出
- OFF: 關(guān)閉所有日志
對于這8個級別,級別依次遞增。級別越高,打印的日志越少。
通常地,只使用TRACE、DEBUG、INFO、WARN、ERROR這5個等級。
Spring Boot會打印指定級別及更高級的日志。
例如日志設(shè)置為INFO級,那么Spring Boot會打印INFO、WARN、ERROR。
配置文件
logback的配置可在application.yml和xml中配置,其中xml配置更加靈活。
若多個配置同時存在,則其加載順序為:
logback.xml → application.yml → logback-spring.xml
后加載的會覆蓋先加載的。因此application.yml會覆蓋logback.xml中的相同配置。即后加載的優(yōu)先級更高。
同理,若要使用 application.yml 中定義的變量,應使用 logback-spring.xml 。官方推薦使用 logback-spring.xml 。
logback.xml
加載logback.xml時,默認會在classpath查找以下文件: 用戶自定義xml > logback-test.xml > logback.groovy > logback.xml 。
如果上述4個配置文件都不存在,那么logback會調(diào)用BasicConfigurator來創(chuàng)建一個最小化配置將日志輸出到控制臺。最小化配置會構(gòu)造一個父為<ROOT>的<ConsoleAppender>,PatternLayoutEncoder為%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n。
其中用戶自定義xml是在application.yml中通過logging.config=classpath:logging-config.xml配置的。
yml配置
logging:
config: classpath:logback.xml # 自定義配置文件
pattern:
file: "%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15} - %msg %n)" # 文件輸出
console: "%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15} - %msg %n)" # 控制臺輸出
file:
name: E:\logs\test.log # 日志文件輸出路徑
level:
root: INFO # root輸出級別
com.spring: WARN # 特定包的輸出級別xml結(jié)構(gòu)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
</appender>
<appender name="ROLLING" class="ch.qos.logback.core.RollingFileAppender">
</appender>
<root></root>
<logger></logger>
</configuration>注意區(qū)分屬性和配置的區(qū)別:
- 屬性:標簽自身的屬性,直接寫在標簽標簽內(nèi),例如
<appender name ="CONSOLE">,name就是`標簽的屬性。 - 配置:標簽的功能設(shè)置,使用子標簽進行配置,例如
<appender><file>testFile.log</file></appender>,<file>就是<appender>標簽的配置。
最外層標簽<configuration>
<configuration>是最外層的標簽,所有其他標簽都要定義在該標簽內(nèi)。<configuration>可設(shè)置多個屬性:
- scan: 啟用掃描。默認為true。當為true時,若配置文件發(fā)生變更,將會被重新加載。
- scanPeriod: 配置文件掃描時間間隔。默認單位是毫秒,可修改。當scan為true時,此屬性生效。默認時間間隔為1分鐘。
- debug: 默認為false。若設(shè)為true,將實時打印出logback內(nèi)部日志信息。
例如:
<configuration scan="false" scanPeriod="60 seconds" debug="false">
<contextName>上下文名稱
為了避免同一服務器上多個web應用的logger產(chǎn)生上下文沖突,可使用<contextName>標簽設(shè)置上下文的名稱,確保每個xml的<contextName>唯一即可。
例如:
<contextName>Test</contextName>
<appender>標簽
<appender>標簽負責寫日志。定義了日志的輸出位置、觸發(fā)策略、格式等。注意只負責寫,不負責日志等級。
一個<appender>標簽負責一種日志。由于一個系統(tǒng)中往往包含多種日志,因此通常同時使用多個<appender>標簽。<appender>包含2個屬性:
name: 指定<appender>的名稱,可自定義。需在root標簽中引用。class: 指定所使用實現(xiàn)庫中Appender類的含路徑名稱。
關(guān)于class,有以下幾個常用取值:
ch.qos.logback.core.ConsoleAppender: 輸出到控制臺。ch.qos.logback.core.FileAppender: 輸出到靜態(tài)記錄文件。ch.qos.logback.core.rolling.RollingFileAppender: 輸出到滾動日志文件。ConsoleAppender
ConsoleAppender最為簡單,直接輸出到控制臺。通常用于開發(fā)調(diào)試。ConsoleAppender常用的設(shè)置為:
<encoder>: 對記錄事件進行格式化。
例如:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>console %d %p - %m%n</pattern>
</encoder>
</appender>FileAppender
FileAppender會將所有的日志信息都寫入到一個文件中。因此若append屬性為true,則日志文件會越來越大。FileAppender常用的設(shè)置為:
<file>: 文件名。無默認值,必須設(shè)置。其路徑可以為絕對或相對。若上級目錄不存在則會自動創(chuàng)建。<append>: 是否開啟追加。默認為true。若為true,則新的日志會追加到文件末尾;若為false,則寫新日志前會清空日志文件。<encoder>: 對記錄事件進行格式化。<prudent>: 是否安全寫入文件。默認為false。效率低。
例如:
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>testFile.log</file> <append>true</append> <encoder> <pattern>%d %p - %m%n</pattern> </encoder> </appender
RollingFileAppender
RollingFileAppender會將日志滾動記錄,即寫入一個文件,當滿足條件時,再寫入下一個文件。例如設(shè)置文件大小為30MB,則當寫入的日志文件達到30MB時會再新建一個日志文件進行寫入。達到條件這個行為稱為滾動。RollingFileAppender常用的設(shè)置為:
<file>: 文件名。無默認值,必須設(shè)置。其路徑可以為絕對或相對。若上級目錄不存在則會自動創(chuàng)建。<append>: 是否開啟追加。默認為true。若為true,則新的日志會追加到文件末尾;若為false,則寫新日志前會清空日志文件。<rollingPolicy>: 滾動策略。通常包含:滾動條件(例如最大日志文件大?。?,文件命名格式,日志文件保存期限,等等。<layout>: 日志輸出格式。
例如:
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>testFile.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${app-name}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<MaxHistory>30</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>30MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 日志輸出格式: -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %-5level ] [ %thread ] - [ %logger{50} : %line ] - %msg%n</pattern>
</layout>
</appender<rollingPolicy>滾動策略
<rollingPolicy>使用class屬性指定滾動策略,不同的策略有不同的配置。
1.基于時間的滾動策略:ch.qos.logback.core.rolling.TimeBasedRollingPolicy。
該策略根據(jù)時間來判定是否觸發(fā)滾動。最常用。
常用配置為:
<fileNamePattern>: 文件名格式,必須??梢允褂?code>%d轉(zhuǎn)換符來接收一個java.text.SimpleDateFormat對象,例如%d{yyyy-MM-dd HH:mm:ss.SSS}。<maxHistory>: 日志文件保留天數(shù)。
2.基于文件大小的滾動策略:ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy。
該策略會監(jiān)視日志文件大小,當文件超過指定大小時觸發(fā)滾動。
<maxFileSize>: 日志文件大小,默認為10MB。<prudent>: 是否安全寫入文件。若為true,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但此時必須滿足:1不支持也不允許文件壓縮;2不能設(shè)置file屬性。<triggeringPolicy>: 告知 RollingFileAppender 何時激活滾動。
<root>標簽
<root>標簽有2個作用:
- 定義日志的輸出等級。
- 指定哪些
<appender>啟用。
<root>其name屬性固定為ROOT,且沒有上級,故而<root>只有一個屬性:
level: 最重要,指定日志的打印等級,默認為DEBUG。其值可以為:ALL,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF。不可以設(shè)置為INHERITED或NULL`。
可以在<root>下配置多個<appender-ref>,標識對應的<appender>被添加到<root>下,從而可以繼承<root>的屬性和內(nèi)容。
例如:
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
<appender-ref ref="ROLLING" />
</root>其中<appender-ref>的ref屬性即為<appender>或<logger>的name屬性。<root>也是一個特殊的<logger>,且為所有<logger>的最上級父。<root>的parent屬性為null。
<logger>標簽
<logger>標簽非必須,用于對某些日志等級進行單獨定義。
例如設(shè)置<root level="INFO">,但希望springframework的等級為WARN,此時就可添加一個<logger>標簽:
<logger name="org.springframework" level="WARN"/>
<logger>常用屬性為:
name: 指定需單獨設(shè)置的組件類名。level: 設(shè)置組件的日志等級。其值可以為:ALL,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF??稍O(shè)置為INHERITED或NULL`。若不設(shè)置,則默認繼承上級的level。additivity: 是否向上級<logger>傳遞打印信息。默認為true。若為true,則本<logger>打印一次,然后傳遞給上級<logger>,上級<logger>會再打印一次,這樣就會造成重復打印。因此通常都設(shè)置為false。
例如:
<logger name="TEST_PARENT" level="INFO" additivity="false">
<appender-ref ref="TEST_CHILD"/>
</logger>這樣就形成了父子關(guān)系,TEST_CHILD的上級為TEST_PARENT。<logger>有一個parent屬性,指向其父<logger>。每個<logger>都有parent,只有<root>除外,<root>是根節(jié)點。因此<root>和所有的<logger>會形成一棵樹。注意父子關(guān)系是由parent屬性形成的,而非類繼承這樣的關(guān)系。
定義變量
變量有兩種:本地變量和配置文件變量。
本地變量<property>
在xml中定義一個變量,然后在整個xml文件中引用。格式為:
<property name="變量名" value="變量值" />
通過${變量名}格式使用變量。例如:
<!-- 定義變量 -->
<property name="LOG_HOME" value="E:/logs/" />
<!-- 使用變量 -->
<appender>
<file>${LOG_HOME}/${app-name}.log</file>
</appender>配置文件變量<springProperty>
若希望從yml或.properties中讀取變量值在xml中使用,則需要使用<springProperty>。
例如,在application.yml中定義了一個logback_app_property.level變量:
logback_app_property: level: INFO
現(xiàn)在希望引用這個level變量,則可在xml中添加<springProperty>標簽,并令其source屬性指向logback_app_property.level變量。
<springProperty name="YML_LEVEL" source="logback_app_property.level" defaultValue="INFO"/>
同樣是通過${變量名}格式使用變量:
<root level="${YML_LEVEL}">
</root>實例
首先在yml中定義
logging: # 指定 logback-app.xml 作為logback的配置文件 config: classpath:logback-app.xml # 用于 logback-app.xml 文件配置的參數(shù)值 logback_app_property: # TRACE < DEBUG < INFO < WARN < ERROR level: INFO
然后在logback-app.xml中定義:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>Application</contextName>
<jmxConfigurator/>
<!-- 定義日志的保存目錄 -->
<!-- <property name="LOG_HOME" value="/app/logs/" /> -->
<property name="LOG_HOME" value="E:/logs/" />
<property name="app-name" value="test-admin"/>
<property name="filename" value="server"/>
<!-- 編碼設(shè)置 -->
<property name="ENCODER_PATTERN" value="%red(%date{ISO8601}]) %highlight(%-5level) %green([%10.10thread]) [%X{X-B3-TraceId}] %boldMagenta(%logger{20}) - %cyan(%msg%n)" />
<!-- 控制臺輸出 -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${ENCODER_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 滾動輸出到文件:將日志記錄到指定文件,滿足條件時,再寫入下一個文件 -->
<appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 指定日志文件的名稱 -->
<file>${LOG_HOME}/${app-name}.log</file>
<!-- TimeBasedRollingPolicy: 基于時間的滾動策略,該策略根據(jù)時間來判定是否觸發(fā)滾動。 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--
滾動時產(chǎn)生的文件的存放位置及文件名稱 %d{yyyy-MM-dd}:按天進行日志滾動
%i:當文件大小超過maxFileSize時,按照i進行文件滾動
-->
<fileNamePattern>${LOG_HOME}/${app-name}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!--
可選節(jié)點,控制保留的歸檔文件的最大數(shù)量,超出數(shù)量就刪除舊文件。
假如設(shè)置每天滾動,maxHistory是365,則只保存最近365天的文件,刪除之前的舊文件。
注意,刪除舊文件時那些為了歸檔而創(chuàng)建的目錄也會被刪除。
-->
<MaxHistory>30</MaxHistory>
<!--
當日志文件超過maxFileSize指定的大小時,根據(jù)上面提到的%i進行日志文件滾動。
注意此處配置SizeBasedTriggeringPolicy是無法實現(xiàn)按文件大小進行滾動的,必須配置timeBasedFileNamingAndTriggeringPolicy
-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>30MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 日志輸出格式: -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %-5level ] [ %thread ] - [ %logger{50} : %line ] - %msg%n</pattern>
</layout>
</appender>
<!-- error信息輸出 -->
<appender name="errorLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${app-name}-error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${app-name}-error-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>90</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %-5level ] [ %thread ] - [ %logger{50} : %line ] - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
</appender>
<!-- 這些日志不要打印debug,不然數(shù)量太多 -->
<!-- 選擇使用的框架進行配置 -->
<logger name="org.springframework" level="WARN"/>
<logger name="org.spring" level="WARN"/>
<logger name="org.hibernate" level="WARN"/>
<logger name="io.grpc.netty" level="OFF"/>
<logger name="org.eclipse.jetty" level="WARN"/>
<logger name="jndi" level="WARN"/>
<logger name="redis.clients" level="WARN"/>
<logger name="application" level="WARN"/>
<logger name="springfox.documentation" level="WARN"/>
<logger name="com.netflix" level="WARN"/>
<logger name="org.reflections" level="WARN"/>
<logger name="org.apache" level="WARN"/>
<logger name="io.grpc.internal.ClientCallImpl" level="OFF"/>
<logger name="org.springframework.amqp.rabbit" level="ERROR"/>
<logger name="com.baomidou.dynamic.datasource.DynamicRoutingDataSource" level="WARN"/>
<logger name="com.zaxxer.hikari.pool.HikariPool" level="WARN"/>
<logger name="org.quartz.core.QuartzSchedulerThread" level="ERROR"/>
<logger name="io.lettuce.core.protocol.RedisStateMachine" level="INFO"/>
<logger name="io.lettuce.core.RedisChannelHandler" level="INFO"/>
<logger name="io.lettuce.core.protocol.CommandHandler" level="INFO"/>
<logger name="io.lettuce.core.protocol.CommandEncoder" level="INFO"/>
<logger name="io.lettuce.core.protocol.DefaultEndpoint" level="INFO"/>
<logger name="io.lettuce.core.protocol.ConnectionWatchdog" level="INFO"/>
<logger name="io.lettuce.core.RedisClient" level="INFO"/>
<logger name="org.mybatis.spring.mapper.ClassPathMapperScanner" level="INFO"/>
<logger name="com.baomidou.mybatisplus.core.MybatisConfiguration" level="INFO"/>
<!-- 配置文件變量 -->
<springProperty name="LEVEL" source="logback_app_property.level" defaultValue="INFO"/>
<root level="${LEVEL}">
<appender-ref ref="consoleAppender"/>
<appender-ref ref="appLogAppender" />
<appender-ref ref="errorLogAppender" />
</root>
</configuration>在程序中動態(tài)更改日志級別
在程序中使用代碼來動態(tài)修改日志級別,首先導入庫:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext;
然后獲取<ROOT>并修改level:
String loggerName = "ROOT"; String loggerLevel = "DEBUG"; // 獲取日志上下文 LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); // 獲取ROOT ch.qos.logback.classic.Logger logger = loggerContext.getLogger(loggerName); // 修改日志等級 logger.setLevel(Level.valueOf(loggerLevel));
注意這里的loggerName與JMX不同,是大小寫不敏感的,例如ROOT可以寫作root。
Java管理擴展 JMX(Java Management Extensions)
JMX是一個帶窗口的應用程序,為運行中的應用提供管理功能。JMX是跨平臺的,與具體應用無關(guān)。配置logback開啟JMX后即可通過JMX查看logback信息。
配置logback開啟JMX,需在xml中添加一行標簽:
<configuration> <jmxConfigurator /> </configuration>
當應用運行后,打開系統(tǒng)的CMD窗口,在其中輸入命令:
jconsole
然后就會打開JMX的應用窗口,并提示新建連接。設(shè)應用程序運行在本地,則在本地進程的列表中選擇對應的應用程序,然后雙擊或點連接。

之后可能彈出安全連接失敗。是否以不安全的方式重試?,選擇不安全的連接即可。

在上方的標簽列表中點擊MBean標簽,然后在列表中找到ch.qos.logbak.classic,依次點擊進入default→ch.qos.logback.classic.jmx.JMXConfigurator,其下會列出屬性和操作兩個列表。在其下分別包含不同的功能。
對于屬性,包含LoggerList和Statuses。其中LoggerList列出了所有的Logger。特殊地,<root>標簽其對應名稱為ROOT,會列在第一行。

對于操作,可進行:
- 重新加載logback的默認配置文件。
- 通過指定的URL重新加載配置文件。
- 通過指定的文件重新加載配置文件。
- 設(shè)置指定logger級別,可設(shè)為
null。 - 獲取指定logger級別,可返回
null。 - 指定logger的有效級別。

點擊屬性下的LoggerList,即可看到一個Logger數(shù)組。第一個就是ROOT。
點擊操作下的getLoggerLevel,需輸入一個參數(shù)p1,該參數(shù)就是LoggerList中的一個Logger。輸入ROOT,然后點擊按鈕getLoggerLevel,即可看到ROOT的等級。注意這里的p1是大小寫敏感的,例如ROOT不可以寫作root。
點擊操作下的setLoggerLevel,需輸入兩個參數(shù)p1和p2,p1為Logger名稱,p2為level值。例如p1輸入ROOT,p2輸入DEBUG,然后點擊按鈕setLoggerLevel,即可將ROOT變更為DEBUG等級。
同理,更改應用的配置文件 logback.xml ,然后點擊 操作 下的reloadDefaultConfiguration,并點擊右側(cè)的reloadDefaultConfiguration按鈕,即可重新加載配置文件。
但在實際測試中,若配置文件為 logback.xml ,則表現(xiàn)相對正常;而若配置文件為其他名稱,例如 logback-spring.xml ,則重載配置文件后原控制臺將不再進行打印,且對配置文件的修改也不會生效。似乎reloadDefaultConfiguration只識別 logback.xml 。
另外,修改配置文件只能是更改 logback.xml 本身。如果修改的是application.yml中的logback_app_property.level變量,reloadDefaultConfiguration時并不會重新讀取該變量并應用到 logback.xml 中。
一般來說,通過JMX來修改的只有ROOT,以及l(fā)ogback.xml中配置的多個<logger>。
到此這篇關(guān)于Spring Boot日志SLF4J和Logback詳解的文章就介紹到這了,更多相關(guān)Spring Boot SLF4J和Logback內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Data JPA+kkpager實現(xiàn)分頁功能實例
本篇文章主要介紹了Spring Data JPA+kkpager實現(xiàn)分頁功能實例,具有一定的參考價值,有興趣的可以了解一下2017-06-06
詳解java.lang.NumberFormatException錯誤及解決辦法
這篇文章主要介紹了詳解java.lang.NumberFormatException錯誤及解決辦法,本文詳解的介紹了錯誤的解決方法,感興趣的可以一起來了解一下2020-05-05
搭建Springboot框架并添加JPA和Gradle組件的方法
這篇文章主要介紹了搭建Springboot框架并添加JPA和Gradle組件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
Spring AOP手動實現(xiàn)簡單動態(tài)代理的代碼
今天小編就為大家分享一篇關(guān)于Spring AOP手動實現(xiàn)簡單動態(tài)代理的代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03

