Spring Boot的起步依賴(如spring-boot-starter-web)中已經(jīng)包含了Slf4j的依賴,無需額外添加。:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
當你在項目中添加了spring-boot-starter-web
依賴后,它將自動引入以下關(guān)鍵組件和依賴項:
- Spring MVC:用于構(gòu)建Web應(yīng)用程序的模型-視圖-控制器(Model-View-Controller)框架。
- Tomcat(或其他嵌入式Web服務(wù)器):用于運行和部署Web應(yīng)用程序。
- Spring Web:提供Web開發(fā)所需的核心功能,如請求處理、過濾器、異常處理等。
- Jackson(或其他JSON處理庫):用于處理JSON數(shù)據(jù)的序列化和反序列化。
- 其他輔助依賴項:包括Servlet API、Spring Boot自動配置等。
通過添加spring-boot-starter-web
依賴,你可以方便地構(gòu)建和開發(fā)基于Spring Boot的Web應(yīng)用程序。它提供了必要的組件和配置,使你能夠處理HTTP請求、定義控制器、處理表單提交、返回JSON或HTML響應(yīng)等。
spring-boot-starter-web
依賴中已經(jīng)集成了日志框架。在Spring Boot中,默認使用的是SLF4J(Simple Logging Facade for Java)作為日志抽象層,并且使用Logback作為默認的日志實現(xiàn)。
SLF4J是一個日志抽象層,它提供了統(tǒng)一的日志接口,可以與多個具體的日志實現(xiàn)框架進行集成。而Logback是SLF4J的一個實現(xiàn),它提供了強大的日志功能和靈活的配置選項。
當你添加了spring-boot-starter-web
依賴后,它會自動引入spring-boot-starter-logging
依賴,該依賴會將SLF4J和Logback集成到你的項目中。這意味著你可以直接在代碼中使用SLF4J的API進行日志記錄,而無需額外的配置。
在項目中添加 logback-spring.xml 文件,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設(shè)置為WARN,則低于WARN的信息都不會輸出 -->
<!-- scan:當此屬性設(shè)置為true時,配置文檔如果發(fā)生改變,將會被重新加載,默認值為true -->
<!-- scanPeriod:設(shè)置監(jiān)測配置文檔是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。
當scan為true時,此屬性生效。默認的時間間隔為1分鐘。 -->
<!-- debug:當此屬性設(shè)置為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。默認值為false。 -->
<configuration scan="true" scanPeriod="10 seconds">
<contextName>logback</contextName>
<!-- name的值是變量的名稱,value的值時變量定義的值。通過定義的值會被插入到logger上下文中。定義后,可以使“${}”來使用變量。 -->
<property name="log.path" value="logs" />
<!--0. 日志格式和顏色渲染 -->
<!-- 彩色日志依賴的渲染類 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!--1. 輸出到控制臺-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是為開發(fā)使用,只配置最底級別,控制臺輸出的日志級別是大于或等于此級別的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 設(shè)置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--2. 輸出到文檔-->
<!-- 2.1 level為 DEBUG 日志,時間滾動輸出 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文檔的路徑及文檔名 -->
<file>${log.path}/web_debug.log</file>
<!--日志文檔輸出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 設(shè)置字符集 -->
</encoder>
<!-- 日志記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志歸檔 -->
<fileNamePattern>${log.path}/web-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文檔保留天數(shù)-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 此日志文檔只記錄debug級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 2.2 level為 INFO 日志,時間滾動輸出 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文檔的路徑及文檔名 -->
<file>${log.path}/web_info.log</file>
<!--日志文檔輸出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志歸檔路徑以及格式 -->
<fileNamePattern>${log.path}/web-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文檔保留天數(shù)-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文檔只記錄info級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 2.3 level為 WARN 日志,時間滾動輸出 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文檔的路徑及文檔名 -->
<file>${log.path}/web_warn.log</file>
<!--日志文檔輸出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<!-- 日志記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/web-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文檔保留天數(shù)-->
<maxHistory>5</maxHistory>
</rollingPolicy>
<!-- 此日志文檔只記錄warn級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 2.4 level為 ERROR 日志,時間滾動輸出 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文檔的路徑及文檔名 -->
<file>${log.path}/web_error.log</file>
<!--日志文檔輸出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<!-- 日志記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/web-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文檔保留天數(shù)-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 此日志文檔只記錄ERROR級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--
<logger>用來設(shè)置某一個包或者具體的某一個類的日志打印級別、
以及指定<appender>。<logger>僅有一個name屬性,
一個可選的level和一個可選的addtivity屬性。
name:用來指定受此logger約束的某一個包或者具體的某一個類。
level:用來設(shè)置打印級別,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
還有一個特俗值INHERITED或者同義詞NULL,代表強制執(zhí)行上級的級別。
如果未設(shè)置此屬性,那么當前l(fā)ogger將會繼承上級的級別。
addtivity:是否向上級logger傳遞打印信息。默認是true。
<logger name="org.springframework.web" level="info"/>
<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
-->
<!--
使用mybatis的時候,sql語句是debug下才會打印,而這里我們只配置了info,所以想要查看sql語句的話,有以下兩種操作:
第一種把<root level="info">改成<root level="DEBUG">這樣就會打印sql,不過這樣日志那邊會出現(xiàn)很多其他消息
第二種就是單獨給dao下目錄配置debug模式,代碼如下,這樣配置sql語句會打印,其他還是正常info級別:
【logging.level.org.mybatis=debug logging.level.dao=debug】
-->
<!--
root節(jié)點是必選節(jié)點,用來指定最基礎(chǔ)的日志輸出級別,只有一個level屬性
level:用來設(shè)置打印級別,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
不能設(shè)置為INHERITED或者同義詞NULL。默認是DEBUG
可以包含零個或多個元素,標識這個appender將會添加到這個logger。
-->
<include resource="org/springframework/boot/logging/logback/base.xml" />
<!--<logger name="org.springframework.web" level="INFO"/>
<logger name="org.springboot.sample" level="TRACE" />-->
<!-- 開發(fā)、測試環(huán)境 -->
<springProfile name="dev,test">
<!-- <logger name="org.springframework.web" level="INFO"/>-->
<!-- <logger name="org.springboot.sample" level="INFO" />-->
<logger name="biz" level="INFO" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="ERROR_FILE" />
<appender-ref ref="WARN_FILE" />
</root>
</springProfile>
<!-- 生產(chǎn)環(huán)境 -->
<springProfile name="prod">
<logger name="org.springframework.web" level="ERROR"/>
<logger name="org.springboot.sample" level="ERROR" />
<logger name="biz" level="ERROR" />
<root level="error">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="ERROR_FILE" />
<appender-ref ref="WARN_FILE" />
</root>
</springProfile>
</configuration>
在業(yè)務(wù)代碼中對需要加日志的類添加注解? @Slf4j
在具體需要加日志的地方,按需使用如下語句,等級依次是從低到高
//日志等級為 debug
log.debug("我的測試接口,參數(shù)為: {}",params);
//日志等級為 info
log.info("我的測試接口,參數(shù)為: {}",params);
//日志等級為warn
log.warn("我的測試接口,參數(shù)為: {}",params);
//日志等級為error
log.error("我的測試接口,參數(shù)為: {}",params);
配置文件不論是使用 bootstrap.yml 還是application.yml,均需要指定環(huán)境,需和?logback-spring.xml 中?springProfile 配置的name匹配,會選擇指定的日志等級
<springProfile name="dev,test">
...
</springProfile>
spring:
profiles:
active: dev
在Spring Cloud項目中,bootstrap.yml
的優(yōu)先級比application.yml
更高。
bootstrap.yml
是在Spring應(yīng)用程序啟動的早期加載的配置文件,它用于進行系統(tǒng)級別的配置,例如連接到配置服務(wù)器、配置加密等。它在應(yīng)用程序上下文被創(chuàng)建之前加載,因此可以在應(yīng)用程序的早期階段使用它來配置一些必要的屬性。
相比之下,application.yml
是應(yīng)用程序級別的配置文件,用于配置應(yīng)用程序的具體行為和屬性。
由于bootstrap.yml
在應(yīng)用程序上下文創(chuàng)建之前加載,它的配置會覆蓋application.yml
中相同屬性的配置。這使得bootstrap.yml
可以用于設(shè)置一些全局的配置,而application.yml
則用于設(shè)置應(yīng)用程序特定的配置。
因此,如果bootstrap.yml
和application.yml
中存在相同的屬性配置,bootstrap.yml
中的配置將覆蓋application.yml
中的配置。這樣可以確保系統(tǒng)級別的配置優(yōu)先于應(yīng)用程序級別的配置。文章來源:http://www.zghlxwxcb.cn/news/detail-739630.html
故如果在?bootstrap.yml 中指定了環(huán)境,但是沒找到配置文件,然后加載了application.yml 配置文件內(nèi)容,環(huán)境會以?bootstrap.yml 為準。如果環(huán)境和?springProfile 不匹配會出現(xiàn)日志無法輸出到日志文件的情況。文章來源地址http://www.zghlxwxcb.cn/news/detail-739630.html
到了這里,關(guān)于記錄一次@Slf4j log.info 日志信息未輸出到日志文件的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!