11.springboot與日誌
阿新 • • 發佈:2022-05-10
市場上的日誌框架:
JUL,JCL,Jboss-logging,logback,log4j,log4j2,slf4j...
左邊選擇一個抽象層,右邊選擇一個實現!
日誌門面選擇:SLF4J
日誌實現:LogBack
springBoot:底層是spring框架,spring框架預設使用的是JCL
springboot選用的是SLF4J和LogBack
以後在開發時,日誌記錄方法的呼叫,不應該直接呼叫日誌的實現類,而是應該呼叫日誌抽象層裡面的方法
使用示例:
logback.xml:直接被日誌框架識別到了
logback-spring.xml:日誌框架就不會直接載入日誌的配置項,由spring-boot解析日誌配置,可以使用springboot的告警profile共功能
日誌門面(日誌的抽象層:相當於介面) | 日誌實現(介面的實現) |
JCL(jakarta Commons loggging) slf4j(simple logging facade for java) jboss-logging | log4j jul lo4j2 logback |
2.SLF4J的使用
1.如何在系統中使用SLF4J的日誌框架呢
遺留問題
springboot(預設底層使用的是:slf4j和logback) spring(預設底層使用的是comming-logging) hibernate(預設底層使用的是 jboss-logging) 等等 那如何做到日誌的統一呢??和springboot一樣使用slf4j進行日誌輸出呢! 如何讓系統中所有的日誌都使用slf4j呢 做法: 1.將其他系統中的日誌先排除出去 2.用中間包替換原有的日誌框架 3.我們匯入slf4j的實現 總結: 1》springboot底層也是使用slf4j和logback的方式進行日誌記錄 2》springboot也把其他的日誌都替換成了slf4j 3》中間替換包? 4》如果我們要引入其他框架?一定要把這個框架的預設日誌依賴移除掉,匯入中間轉換包,最終日誌以slf4j和logback的形式進行統一 例如:spring框架用的是commons-logging的日誌框架,springboot底層就是spring,他在匯入spring依賴時: 日誌的使用:logging.path和logging.file的區別Logger logger = LoggerFactory.getLogger(getClass());--->這裡的LoggerFactoryjar包必須是slf4j的 @Test public void test0(){ /** * 日誌級別從低禱告: trace<debug<info<warm<erro * 可以調整日誌的輸出級別:日誌就只會在這個級別以後的高級別生效 */ logger.trace("這是trace日誌.."); logger.debug("這時debug日誌..."); //springboot預設給我們使用的是info(info以及更高級別)級別的,沒有指定級別的就是用springboot預設規定的級別:又稱root級別 logger.info("這這是info日誌..."); logger.warn("這是warm日誌.."); logger.error("這是erro日誌..."); } 輸出:發現其只輸出了info以及更高日誌-->springboot的預設輸出級別! 2020-09-20 11:35:15.530 INFO 11648 --- [ main] cn.com.wmd.SpringBootTest : 這這是info日誌... 2020-09-20 11:35:15.530 WARN 11648 --- [ main] cn.com.wmd.SpringBootTest : 這是warm日誌.. 2020-09-20 11:35:15.538 ERROR 11648 --- [ main] cn.com.wmd.SpringBootTest : 這是erro日誌... 這個預設的輸出級別在application.properties可做更改:logging.level.包=日誌級別---->意思是在包(cn)下的所有類使用的日誌級別均是trace logging.level.cn=trace 這時輸出:發現其輸出了全部級別的日誌!! 2020-09-20 11:40:46.392 TRACE 14656 --- [ main] cn.com.wmd.SpringBootTest : 這是trace日誌.. 2020-09-20 11:40:46.392 DEBUG 14656 --- [ main] cn.com.wmd.SpringBootTest : 這時debug日誌... 2020-09-20 11:40:46.392 INFO 14656 --- [ main] cn.com.wmd.SpringBootTest : 這這是info日誌... 2020-09-20 11:40:46.392 WARN 14656 --- [ main] cn.com.wmd.SpringBootTest : 這是warm日誌.. 2020-09-20 11:40:46.398 ERROR 14656 --- [ main] cn.com.wmd.SpringBootTest : 這是erro日誌...
logging.file | logging.path | 示例 | 描述 |
不指定 | 不指定 | 只在控制檯輸出 | |
指定檔名 | 不指定 | my.log | 輸出日誌到my.log |
不指定 | 指定目錄 | /var/log | 輸出到指定目錄的spring.log檔案中 |
2.指定日誌檔案的配置 給類路徑下放上每個日誌框架自己的配置檔案即可;springboot就不會使用自己的預設配置了在application.properties配置檔案中配置: #在當前磁碟的根目錄下常見spring資料夾和裡面的log資料夾;使用spring.log作為預設的配置檔案 logging.path=/spring/log #不指定路徑會在當前專案下生成springboot.log日誌 #可以指定完整的路徑 logging.file=G:/springboot.log #在控制檯輸出的日誌格式 logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n #指定檔案中日誌輸出的格式 logging.pattern.file=%d{yyyy-MM-dd}===[%thread]===%-5level===%logger{50}===%msg%n 日誌的輸出格式: %d表示日期時間 %thread表示執行緒名 %-5level:級別從左顯示5個字元寬度 %logger{50} 表示logger名稱做i長50個字元,否則按照句點分割 %msg:日誌訊息 %n是換行符 發現控制檯輸出格式: 2020-09-20 [main] TRACE cn.com.wmd.SpringBootTest - 這是trace日誌.. 2020-09-20 [main] DEBUG cn.com.wmd.SpringBootTest - 這時debug日誌... 2020-09-20 [main] INFO cn.com.wmd.SpringBootTest - 這這是info日誌... 2020-09-20 [main] WARN cn.com.wmd.SpringBootTest - 這是warm日誌.. 2020-09-20 [main] ERROR cn.com.wmd.SpringBootTest - 這是erro日誌... 檔案輸出格式: 2020-09-20===[main]===TRACE===cn.com.wmd.SpringBootTest===這是trace日誌.. 2020-09-20===[main]===DEBUG===cn.com.wmd.SpringBootTest===這時debug日誌... 2020-09-20===[main]===INFO ===cn.com.wmd.SpringBootTest===這這是info日誌... 2020-09-20===[main]===WARN ===cn.com.wmd.SpringBootTest===這是warm日誌.. 2020-09-20===[main]===ERROR===cn.com.wmd.SpringBootTest===這是erro日誌...
日誌框架 | 配置檔名稱 |
Logback | logback-spring.xml ,logback-spring.groovy, logback.xml, logback.groovy |
log4j2 | log4j2-spring.xml, log4j.xml |
JDK(Java Util Logging) | logging.properties |
<springProfile name="staging">
可以指定某段配置只在某個環境下生效
</springProfile>