SpringBoot使用slf4j日志并輸出到文件中的操作方法
slf4j日志(3月11日)
再使用前,先了解一下介紹,否則你也不會(huì)用!
1、日志級(jí)別
- SLF4J將日志分為trace、debug、info、warn、error五個(gè)級(jí)別,每個(gè)級(jí)別對(duì)應(yīng)記錄不同的日志,對(duì)應(yīng)不同的使用場景。
- 日志級(jí)別從低到高分為
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
如果設(shè)置為
WARN
,則低于WARN
的信息都不會(huì)輸出一般設(shè)置為
DEBUG
就夠用了,看具體的業(yè)務(wù)需求,開發(fā)時(shí)設(shè)置成 trace 方便定位問題,在生產(chǎn)環(huán)境上,將這個(gè)日志級(jí)別再設(shè)置成 error 級(jí)別即可。
trace
trace是最低優(yōu)先級(jí)的日志,一般用來追蹤詳細(xì)的程序運(yùn)行流,比如程序的運(yùn)行過程中,運(yùn)行到了哪一個(gè)方法,進(jìn)入了哪一條分支。通過trace程序的運(yùn)行流程,可以判斷程序是否按照期望的邏輯在運(yùn)行。舉個(gè)例子,有以下代碼段。
public class Car{ //點(diǎn)火 public void fire(){ log.trace("fire") ... }
debug
debug是比trace高一級(jí)別的日志,該級(jí)別的日志就是用來debug用的。這類日志往往用在判斷是否有出現(xiàn)bug的場景,且往往記錄了代碼運(yùn)行的詳細(xì)信息,比如方法調(diào)用傳入的參數(shù)信息。
假設(shè)運(yùn)行的過程中出現(xiàn)了問題,為了定位問題的原因,可以使用debug級(jí)別的日志來記錄檔位,通過記錄運(yùn)行時(shí)傳入的gear來判斷是不是因?yàn)闄n位輸入錯(cuò)誤而導(dǎo)致Car起步失敗。
//掛檔 public void gear(int gear){ log.trace("gear") //記錄檔位 log.debug(gear) ... }
info
info比debug高一級(jí)別,用來記錄程序運(yùn)行的一些關(guān)鍵信息,它不像trace那樣記錄程序運(yùn)行的整個(gè)流程,也不像debug那樣為了解決問題而記錄詳細(xì)的信息。
info記錄的是整個(gè)系統(tǒng)的運(yùn)行信息,比如系統(tǒng)運(yùn)行到了哪一個(gè)階段,到達(dá)了哪一個(gè)狀態(tài)。還是以車啟動(dòng)為例子,將啟動(dòng)的代碼修改如下。
public void static main(String[] args){ Car car = new Car(); car.fire(); car.clutch(); car.gear(1); car.looseBrake(); log.info("car is ready to run faster !"); } 可以看到,運(yùn)行完looseBrake方法之后,使用info記錄了車的狀態(tài),車已經(jīng)完成了起步了,可以踩油門加速了。
warn
warn比info的級(jí)別更高,用來記錄一些警告信息。警告信息表示,程序進(jìn)入了一個(gè)特殊的狀態(tài),在該狀態(tài)下程序可以繼續(xù)運(yùn)行,但是不建議讓程序進(jìn)入該狀態(tài),因?yàn)樵摖顟B(tài)可能導(dǎo)致結(jié)果出現(xiàn)問題
車啟動(dòng)的過程中如果以大于1檔起步,就使用warn記錄警告,告訴調(diào)用者不推薦這樣使用,實(shí)際上2檔起步也是可以的,但可能會(huì)出問題
//掛檔 public void gear(int gear){ log.trace("gear") //記錄檔位 log.debug(gear) if(gear > 1){ log.warn("gear "+ gear +" is too high !") } ... }
error
error級(jí)別的日志是最高優(yōu)先級(jí)了,用來記錄運(yùn)行時(shí)的錯(cuò)誤信息,表示程序運(yùn)行過程中出現(xiàn)了需要被解決的問題,往往是一些異常。使用error日志的時(shí)候,一般會(huì)將詳細(xì)的異常出現(xiàn)的原因記錄。
public void static main(String[] args){ Car car = new Car(); try{ car.fire(); car.clutch(); car.gear(1); car.looseBrake(); }catch(Exception e){ log.error("run failed !",e.getCause()) } log.info("car is ready to run faster !"); }
2、spring boot使用 日志接口介紹
SpringBoot 在所有內(nèi)部日志中使用Commons Logging,但是默認(rèn)配置也提供了對(duì)常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每種Logger都可以通過配置使用控制臺(tái)或者文件輸出日志內(nèi)容。
SLF4J類似于Commons Logging,也是一個(gè)日志接口,而Logback類似于Log4j,是一個(gè)日志的實(shí)現(xiàn)。
根據(jù)不同的日志系統(tǒng),你可以按如下規(guī)則組織配置文件名,就能被正確加載:
Spring Boot官方推薦使用帶有
-spring
的文件名作為你的日志配置(如logback-spring.xml,而不是logback.xml),命名為logback-spring.xml的日志配置文件,spring boot可以為它添加一些spring boot特有的配置項(xiàng)(下面會(huì)提到)。默認(rèn)的命名規(guī)則,并且放在
src/main/resources
下面即可
- Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
- Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
- Log4j2:log4j2-spring.xml, log4j2.xml
- JDK (Java Util Logging):logging.properties
引入依賴
spring-boot-starter
這個(gè)包就自帶了 logging
的依賴包,SpringBoot會(huì)默認(rèn)使用 logback
作為日志框架,在生成springboot項(xiàng)目的時(shí)候可以直接勾選logback,那么就可以直接使用logback了。手動(dòng)添加的話,建議使用slf4j+logback,后面項(xiàng)目更容易維護(hù):
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
日志配置類介紹
如下配置將:
- 在根目錄
applog
中每天生成一個(gè)文件夾,并生成一個(gè)天級(jí)別的日志文件。 - Logger標(biāo)簽:作為日志的記錄器,把它關(guān)聯(lián)到應(yīng)用的對(duì)應(yīng)的context上后,主要用于存放日志對(duì)象,也可以定義日志類型、級(jí)別。
- Appender主要用于指定日志輸出的目的地,目的地可以是控制臺(tái)、文件、遠(yuǎn)程套接字服務(wù)器、 MySQL、PostreSQL、 Oracle和其他數(shù)據(jù)庫、 JMS和遠(yuǎn)程UNIX Syslog守護(hù)-進(jìn)程等。
- Layout 負(fù)責(zé)把事件轉(zhuǎn)換成字符串,格式化的日志信息的輸出
logback-spring.xml,放在 src/main/resources
下面
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <contextName>logback</contextName> <!--輸出到控制臺(tái)--> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!--按天生成日志,即一天只生成一個(gè)文件夾和一個(gè)日志文件--> <appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <Prudent>true</Prudent> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern> applog/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.log </FileNamePattern> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern> %d{yyyy-MM-dd HH:mm:ss} -%msg%n </Pattern> </layout> </appender> <!-- logger節(jié)點(diǎn),可選節(jié)點(diǎn),作用是指明具體的包或類的日志輸出級(jí)別, 以及要使用的<appender>(可以把<appender>理解為一個(gè)日志模板)。 addtivity:非必寫屬性,是否向上級(jí)loger傳遞打印信息。默認(rèn)是true--> <logger name="com.framework.job" additivity="false"> <appender-ref ref="console"/> <appender-ref ref="logFile"/> </logger> <!--項(xiàng)目的整體的日志打印級(jí)別為info--> <root level="info"> <appender-ref ref="console"/> <appender-ref ref="logFile"/> </root> </configuration>
日志級(jí)別單獨(dú)配置
在application.yml使用以下方式,可以單獨(dú)設(shè)置每個(gè)包下的日志記錄級(jí)別,其中file屬性可有可無
logging: file: applog/sys.log level: com: leshangju: prism: auth: dao: debug usershop: dao: debug loginuser: dao: debug
application.properties
logging.level.com.framework.job : info
測試結(jié)果
@Slf4j public class MyJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("啟動(dòng)定時(shí)任務(wù) My Job:" + LocalDateTime.now()); log.trace("進(jìn)入了myjob任務(wù)"); try { Thread.sleep(3000); log.trace("睡了3秒"); } catch (InterruptedException e) { e.printStackTrace(); } log.info("結(jié)束任務(wù)!"); System.out.println("end My Job:" + LocalDateTime.now()); } }
控制臺(tái):
根目錄生成文件:
slf4j,logback,log4j的區(qū)別
slf4j(Simple logging Facade for Java) 簡單日志門面,日志系統(tǒng)的實(shí)現(xiàn)進(jìn)行了具體的抽象化,只提供了統(tǒng)一的日志使用接口,沒有任何日志實(shí)現(xiàn),只有一個(gè)jar包(slf4j-api.jar)。
log4j和logback是具體的日志框架。這兩個(gè)日志框是同一個(gè)作者開發(fā),后者性能更高。
logbak直接實(shí)現(xiàn)slf4j接口,性能更高
springboot默認(rèn)日子框架為logback
到此這篇關(guān)于SpringBoot使用slf4j日志并輸出到文件中的文章就介紹到這了,更多相關(guān)SpringBoot slf4j日志輸出到文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot監(jiān)聽Nacos動(dòng)態(tài)修改日志級(jí)別的操作方法
- Java?SpringBoot項(xiàng)目如何優(yōu)雅的實(shí)現(xiàn)操作日志記錄
- SpringBoot使用AOP記錄接口操作日志的方法
- SpringBoot接入輕量級(jí)分布式日志框架(GrayLog)的操作方法
- springboot動(dòng)態(tài)調(diào)整日志級(jí)別的操作大全
- springBoot啟動(dòng)輸出三行日志控制臺(tái)自動(dòng)停止操作
- SpringBoot項(xiàng)目中控制臺(tái)日志的保存配置操作
- 在SpringBoot中記錄用戶操作日志功能
相關(guān)文章
springboot整合vue項(xiàng)目(小試牛刀)
這篇文章主要介紹了springboot整合vue項(xiàng)目(小試牛刀),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09如何解決maven報(bào)錯(cuò):不知道這樣的主機(jī)問題
這篇文章主要介紹了如何解決maven報(bào)錯(cuò):不知道這樣的主機(jī)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04幾種常見的Java運(yùn)行時(shí)異常小結(jié)
在Java編程語言中異常處理是一項(xiàng)關(guān)鍵的機(jī)制,它幫助開發(fā)者識(shí)別和修復(fù)程序運(yùn)行時(shí)可能出現(xiàn)的問題,下面這篇文章主要給大家介紹了幾種常見的Java運(yùn)行時(shí)異常的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08淺談Redis在微服務(wù)架構(gòu)中的幾種應(yīng)用場景
本文介紹在SpringCloud中使用Redis作為Pub/Sub異步通信、緩存或主數(shù)據(jù)庫和配置服務(wù)器的三種場景應(yīng)用。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05Java處理字節(jié)類型數(shù)據(jù)的實(shí)現(xiàn)步驟
字節(jié)(Byte)是計(jì)算機(jī)信息技術(shù)用于計(jì)量存儲(chǔ)容量的一種基本單位,通常簡寫為B,在ASCII編碼中1Byte可以表示一個(gè)標(biāo)準(zhǔn)的英文字符,包括大寫字母、小寫字母、數(shù)字、標(biāo)點(diǎn)符號(hào)和控制字符等,本文給大家介紹了Java如何優(yōu)雅的處理字節(jié)類型數(shù)據(jù),需要的朋友可以參考下2024-07-07攔截器獲取request的值之后,Controller拿不到值的解決
這篇文章主要介紹了攔截器獲取request的值之后,Controller拿不到值的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10