欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?Boot日志SLF4J和Logback示例詳解

 更新時間:2023年07月27日 10:34:58   作者:超頻化石魚  
這篇文章主要介紹了Spring?Boot日志SLF4J和Logback詳解,Logback相比于Log4j,性能提高了10倍以上的性能,占用的內(nèi)存也變小了,并且文檔十分詳細,推薦使用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、Log4j2Logback
  • 外觀庫:Slf4j、Apache Commons Logging

通常只需要引入Slf4j依賴,然后通過Slf4j來調(diào)用LogbackLog4j。
對應地,配置文件除了對Slf4j進行配置,也可以對LogbackLog4j進行配置。

Logback相比于Log4j,性能提高了10倍以上的性能,占用的內(nèi)存也變小了,并且文檔十分詳細。推薦使用Slf4j+Logback。
官網(wǎng):

https://logback.qos.ch/

官方文檔:

https://logback.qos.ch/documentation.html

Slf4jLogbackLog4j是同一個作者,使用了相同的設(shè)計,因此Slf4j直接可調(diào)用LogbackLog4j。而對于其他日志實現(xiàn)庫,例如java.util.logging等,需要使用一個適配器模塊來將Apache Commons Logging的接口轉(zhuǎn)換為Slf4j的可調(diào)用接口。

Spring Boot日志

依賴

Spring Boot默認使用Logback。只需要引入spring-boot-starterspring-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個級別,級別依次遞增。級別越高,打印的日志越少。
通常地,只使用TRACEDEBUG、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,DEBUGINFO,WARNERROR,FATALOFF。不可以設(shè)置為INHERITEDNULL`。

可以在<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è)置組件的日志等級。其值可以為:ALLTRACE,DEBUGINFO,WARN,ERROR,FATALOFF??稍O(shè)置為INHERITEDNULL`。若不設(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,依次點擊進入defaultch.qos.logback.classic.jmx.JMXConfigurator,其下會列出屬性和操作兩個列表。在其下分別包含不同的功能。

對于屬性,包含LoggerListStatuses。其中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ù)p1p2p1為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)文章

  • Java遺傳算法之沖出迷宮

    Java遺傳算法之沖出迷宮

    這篇文章首先詳細介紹了什么是遺傳算法,然后通過遺傳算法的思想用實例解析使用遺傳算法解決迷宮問題,需要的朋友可以參考下
    2017-09-09
  • 關(guān)于junit單元測試@Test的使用方式

    關(guān)于junit單元測試@Test的使用方式

    這篇文章主要介紹了關(guān)于junit單元測試@Test的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java集合框架超詳細小結(jié)

    Java集合框架超詳細小結(jié)

    Java中提供的一種容器,可以用來存儲多個數(shù)據(jù)。java集合大致可以分為Set,List,Queue和Map四種體系。這篇文章主要介紹了Java集合框架超詳細小結(jié),需要的朋友可以參考下
    2021-08-08
  • 基于SpringBoot上傳任意文件功能的實現(xiàn)

    基于SpringBoot上傳任意文件功能的實現(xiàn)

    下面小編就為大家?guī)硪黄赟pringBoot上傳任意文件功能的實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • java實現(xiàn)發(fā)牌小程序

    java實現(xiàn)發(fā)牌小程序

    這篇文章主要為大家詳細介紹了java實現(xiàn)發(fā)牌小程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Spring Data JPA+kkpager實現(xiàn)分頁功能實例

    Spring Data JPA+kkpager實現(xiàn)分頁功能實例

    本篇文章主要介紹了Spring Data JPA+kkpager實現(xiàn)分頁功能實例,具有一定的參考價值,有興趣的可以了解一下
    2017-06-06
  • 詳解java.lang.NumberFormatException錯誤及解決辦法

    詳解java.lang.NumberFormatException錯誤及解決辦法

    這篇文章主要介紹了詳解java.lang.NumberFormatException錯誤及解決辦法,本文詳解的介紹了錯誤的解決方法,感興趣的可以一起來了解一下
    2020-05-05
  • 搭建Springboot框架并添加JPA和Gradle組件的方法

    搭建Springboot框架并添加JPA和Gradle組件的方法

    這篇文章主要介紹了搭建Springboot框架并添加JPA和Gradle組件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Spring AOP手動實現(xiàn)簡單動態(tài)代理的代碼

    Spring AOP手動實現(xiàn)簡單動態(tài)代理的代碼

    今天小編就為大家分享一篇關(guān)于Spring AOP手動實現(xiàn)簡單動態(tài)代理的代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • SpringAop源碼及調(diào)用過程概述

    SpringAop源碼及調(diào)用過程概述

    這篇文章主要介紹了SpringAop源碼及調(diào)用過程概述,Spring AOP(面向切面編程)是Spring框架的一個重要特性,它提供了一種在程序運行期間動態(tài)地將額外的行為織入到代碼中的方式,需要的朋友可以參考下
    2023-10-10

最新評論