SpringBoot和日志
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
? 作者?|??xuweiweiwoaini
來源 |? urlify.cn/yqQRRr
66套java從入門到精通實(shí)戰(zhàn)課程分享
1 市面上的日志框架
市面上的日志框架:JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j……
| 日志門面 (日志的抽象層) | 日志實(shí)現(xiàn) |
|---|---|
| JCL( Jakarta Commons Logging)?SLF4j( Simple Logging Facade for Java)?jboss-logging | Log4j?JUL( java.util.logging)?Log4j2 Logback |
左邊選一個(gè)門面(抽象層),右邊選一個(gè)實(shí)現(xiàn)。
日志門面:SLF4j。
日志實(shí)現(xiàn):Logback。
SpringBoot使用的是SLF4j+Logback。
2 SLF4j的使用
2.1 如何在系統(tǒng)中使用SLF4j
在開發(fā)的時(shí)候,日志記錄方法的調(diào)用,不應(yīng)該直接調(diào)用日志實(shí)現(xiàn)的實(shí)現(xiàn)類,而是調(diào)用日志抽象層里面的方法。
import?org.slf4j.Logger;
import?org.slf4j.LoggerFactory;
public?class?HelloWorld?{
??public?static?void?main(String[]?args)?{
????Logger?logger?=?LoggerFactory.getLogger(HelloWorld.class);
????logger.info("Hello?World");
??}
}
每一個(gè)日志的實(shí)現(xiàn)框架都有自己的配置文件。使用SLF4j以后,配置文件還是做成日志實(shí)現(xiàn)框架的配置文件。
2.2 遺留問題
項(xiàng)目中的日志框架是SLF4j+Logback:Spring(commons-logging)、Hibernate(jboss-logging)、Mybatis……
統(tǒng)一日志框架,讓別的框架統(tǒng)一使用SLF4j進(jìn)行輸出。

總結(jié):如何讓系統(tǒng)中的所有日志框架都統(tǒng)一到SLF4j?
1??將系統(tǒng)中其他日志框架先排除出去。
2??用中間包來替換原有的日志框架。
3??導(dǎo)入SLF4j其他的實(shí)現(xiàn)。
3 SpringBoot日志關(guān)系
SpringBoot 使用如下的日志場(chǎng)景啟動(dòng)器來做日志功能的:
????org.springframework.boot
????spring-boot-starter-logging

總結(jié):
1??SpringBoot底層也是使用SLF4j+logback的方式進(jìn)行日志記錄。
2??SpringBoot也將其他的日志都替換成SLF4j。
3??中間的轉(zhuǎn)換包如下圖所示:

4??如果要引入其它框架,一定要把這個(gè)框架的默認(rèn)日志依賴移除掉。
????org.springframework
????spring-core
????
????????
????????????commons-logging
????????????commons-logging
????????
????
4 日志使用
4.1 默認(rèn)配置
SpringBoot默認(rèn)已經(jīng)幫助我們配置好了日志框架。
package?com.sunxiaping.springboot;
import?org.junit.Test;
import?org.junit.runner.RunWith;
import?org.slf4j.Logger;
import?org.slf4j.LoggerFactory;
import?org.springframework.boot.test.context.SpringBootTest;
import?org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public?class?SpringbootApplicationTests?{
????private?Logger?logger?=?LoggerFactory.getLogger(getClass());
????@Test
????public?void?test()?{
????????//日志的級(jí)別?trace????????//可以調(diào)整輸出的日志級(jí)別,日志只會(huì)在這個(gè)級(jí)別以后的高級(jí)級(jí)別生效
????????logger.trace("*******trace********");
????????logger.debug("********debug*********");
????????//SpringBoot默認(rèn)的日志級(jí)別是info級(jí)別。
????????logger.info("*******info********");
????????logger.warn("*******warn********");
????????logger.error("*******error********");
????}
}
#日志的等級(jí),如果沒有指定包的路徑就是root
logging.level.com.sunxiaping=info
#logging.level.root=warn
#日志文件?如果不指定路徑,默認(rèn)在當(dāng)前項(xiàng)目下生成日志文件;如果指定完整路徑,在指定的路徑中生成日志文件
logging.file=my.log
#日志路徑,在當(dāng)前磁盤的根路徑下創(chuàng)建文件夾,并且日志文件名是spring.log
#?logging.path=/var/log
#?在控制臺(tái)輸出的日志的格式
#logging.pattern.console=
#?在執(zhí)行文件中日志輸出的格式
#logging.pattern.file=
| logging.file | logging.path | 例子 | 描述 |
|---|---|---|---|
| 在控制臺(tái)輸出 | |||
| 指定文件名 | my.log | 輸出日志到my.log | |
| 指定目錄 | /var/log | 輸出到指定目錄的spring.log文件中 |
4.2 指定配置
給類路徑下放上每個(gè)日志框架自己的配置文件即可,SpringBoot就不使用它的默認(rèn)配置。

logback.xml:直接就被日志框架識(shí)別了。
logback-spring.xml:日志框架就不直接加載日志的配置項(xiàng),由SpringBoot解析日志配置,可以使用SpringBoot的高級(jí)Profile功能,否則就會(huì)報(bào)錯(cuò)。
"staging">
????
"dev,?staging">
????
"!production">
????
5 切換日志框架
5.1 切換成Slf4j+Log4j(不推薦)
排除logback的依賴:
????org.springframework.boot
????spring-boot-starter-web
????
????????
????????????logback-classic
????????????ch.qos.logback
????????
????????
????????????log4j-over-slf4j
????????????org.slf4j
????????
????
????org.slf4j
????slf4j-log4j12
在類路徑下引入log4j.properties文件:
###?set?log?levels?###
log4j.rootLogger?=?info,stdout,D,E
###?輸出到控制臺(tái)?###
log4j.appender.stdout?=?org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target?=?System.out
log4j.appender.stdout.layout?=?org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern?=??%d{ABSOLUTE}?%5p?%c{1}:%L?-?%m%n
####?輸出到日志文件?###
#log4j.appender.D?=?org.apache.log4j.DailyRollingFileAppender
#log4j.appender.D.File?=?logs/log.log
#log4j.appender.D.Append?=?true
#log4j.appender.D.Threshold?=?DEBUG?##?輸出DEBUG級(jí)別以上的日志
#log4j.appender.D.layout?=?org.apache.log4j.PatternLayout
#log4j.appender.D.layout.ConversionPattern?=?%-d{yyyy-MM-dd?HH:mm:ss}??[?%t:%r?]?-?[?%p?]??%m%n
#
####?保存異常信息到單獨(dú)文件?###
#log4j.appender.D?=?org.apache.log4j.DailyRollingFileAppender
#log4j.appender.D.File?=?logs/error.log?##?異常日志文件名
#log4j.appender.D.Append?=?true
#log4j.appender.D.Threshold?=?ERROR?##?只輸出ERROR級(jí)別以上的日志!!!
#log4j.appender.D.layout?=?org.apache.log4j.PatternLayout
#log4j.appender.D.layout.ConversionPattern?=?%-d{yyyy-MM-dd?HH:mm:ss}??[?%t:%r?]?-?[?%p?]??%m%n
5.2 切換成Slf4j+Log4j2
只需要導(dǎo)入spring-boot-starter-log4j2,并排除spring-boot-starter-logging:
????org.springframework.boot
????spring-boot-starter-web
????
????????
????????????org.springframework.boot
????????????spring-boot-starter-logging
????????
????
????org.springframework.boot
????spring-boot-starter-log4j2


??? ?
感謝點(diǎn)贊支持下哈?
