Spring Boot(六):一招學(xué)會(huì)Log4j2

Log4j2簡(jiǎn)介

日志框架slf4j胜蛉、j.u.l挠进、log4j色乾、logback、log4j2的比較?和?log4j2配置文件詳解领突,請(qǐng)參考上篇文章《Log4j2使用詳解

Log4j2實(shí)例

下面我們通過實(shí)例來看看Log4j2在Spring Boot中的應(yīng)用

1暖璧、引入log4j2依賴

Spring Boot默認(rèn)使用LogBack,如果我們要使用Log4j2攘须,需要從spring-boot-starter-web中去掉spring-boot-starter-logging依賴漆撞,同時(shí)顯式聲明使用Log4j2的依賴jar包,具體如下:

<dependency>

? ? <groupId>org.springframework.boot</groupId>

? ? <artifactId>spring-boot-starter-web</artifactId>

? ? <exclusions>

? ? ? ? <!-- 去掉默認(rèn)配置 -->

? ? ? ? <exclusion>

? ? ? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? ? ? ? ? <artifactId>spring-boot-starter-logging</artifactId>

? ? ? ? ? ? </exclusion>

? ? </exclusions>

</dependency>

<!-- 引入log4j2依賴 -->

<dependency>

? ? <groupId>org.springframework.boot</groupId>

? ? <artifactId>spring-boot-starter-log4j2</artifactId>

</dependency>

2于宙、創(chuàng)建并配置log4j2-spring.xml

在src/main/resources文件夾下創(chuàng)建log4j2-spring.xml文件浮驳,并寫入如下內(nèi)容:

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

? ? <properties>

? ? ? ? <property name="logBase">~/</property>

? ? </properties>

? ? <Appenders>

? ? ? ? <Console name="Console" target="SYSTEM_OUT">

? ? ? ? ? ? <PatternLayout charset="UTF-8" pattern="[%d] [%-5p] [%t] [%c] - %m%n"/>

? ? ? ? </Console>

? ? ? ? <RollingFile name="RollingFile" fileName="${logBase}/logs/access.log" filePattern="${logBase}/logs/access.%d{yyyy-MM-dd}.log">

? ? ? ? ? ? <PatternLayout pattern="[%d] [%-5p] [%t] [%c] - %m%n"/>

? ? ? ? ? ? <TimeBasedTriggeringPolicy/>

? ? ? ? </RollingFile>

? ? ? ? <RollingFile name="ErrorFile" fileName="${logBase}/logs/error.log" filePattern="${logBase}/logs/error.%d{yyyy-MM-dd}.log">

? ? ? ? ? ? <Filters>

? ? ? ? ? ? ? ? <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>

? ? ? ? ? ? </Filters>

? ? ? ? ? ? <PatternLayout pattern="[%d] [error] [%t] [%c] - %m%n"/>

? ? ? ? ? ? <TimeBasedTriggeringPolicy/>

? ? ? ? </RollingFile>

? ? </Appenders>

? ? <Loggers>

? ? ? ? <Root level="trace">

? ? ? ? ? ? <AppenderRef ref="Console"/>

? ? ? ? ? ? <AppenderRef ref="RollingFile"/>

? ? ? ? ? ? <AppenderRef ref="ErrorFile"/>

? ? ? ? </Root>

? ? </Loggers>

</configuration>

各節(jié)點(diǎn)的詳細(xì)說明,詳見《Log4j2使用詳解

logBase請(qǐng)根據(jù)項(xiàng)目的實(shí)際日志目錄修改

3捞魁、打印日志

一般情況下至会,我們使用LoggerFactory去獲取Logger對(duì)象,在BlogController中我們加入如下內(nèi)容:

private final static Logger logger = LoggerFactory.getLogger(BlogController.class);

@GetMapping(value = "log")

public String printLog() {

? ? logger.trace("trace log");

? ? logger.debug("debug log");

? ? logger.info("info log");

? ? logger.warn("warn log");

? ? logger.error("error log");

? ? return "print log ok";

}

調(diào)用接口谱俭,可以看到控制臺(tái)和日志目錄下的logs/access.log文件中從trace log到error log都依次打印出來奉件,而error.log中打印出了error log。

如果把log4j2-spring.xml文件中的<Root level="trace”>修改為<Root level="info”>昆著,則日志從info級(jí)別開始打印县貌,trace和debug日志不會(huì)打印。

多環(huán)境配置日志文件

Spring Boot默認(rèn)加載log4j2-spring.xml文件凑懂,如果我們想像application.yml配置文件一樣煤痕,不同的環(huán)境配置不同的log4j2文件,比如本地環(huán)境需要在控制臺(tái)打印出來接谨,測(cè)試環(huán)境和線上的日志目錄不同等摆碉,這時(shí)候我們也可以根據(jù)環(huán)境的不同配置不同的日志文件。

1脓豪、創(chuàng)建log4j2-dev.xml巷帝、log4j2-test.xml和log4j2-prod.xml

log4j2-dev.xml:把log4j2-spring.xml文件內(nèi)容copy到log4j2-dev.xml中

log4j2-test.xml:去掉控制臺(tái)打印、修改logBase變量扫夜、修改root的日志level

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

? ? <properties>

? ? ? ? <property name="logBase">~/test/</property>

? ? </properties>

? ? <Appenders>

? ? ? ? <RollingFile name="RollingFile" fileName="${logBase}/logs/access.log" filePattern="${logBase}/logs/access.%d{yyyy-MM-dd}.log">

? ? ? ? ? ? <PatternLayout pattern="[%d] [%-5p] [%t] [%c] - %m%n"/>

? ? ? ? ? ? <TimeBasedTriggeringPolicy/>

? ? ? ? </RollingFile>

? ? ? ? <RollingFile name="ErrorFile" fileName="${logBase}/logs/error.log" filePattern="${logBase}/logs/error.%d{yyyy-MM-dd}.log">

? ? ? ? ? ? <Filters>

? ? ? ? ? ? ? ? <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>

? ? ? ? ? ? </Filters>

? ? ? ? ? ? <PatternLayout pattern="[%d] [error] [%t] [%c] - %m%n"/>

? ? ? ? ? ? <TimeBasedTriggeringPolicy/>

? ? ? ? </RollingFile>

? ? </Appenders>

? ? <Loggers>

? ? ? ? <Root level="info">

? ? ? ? ? ? <AppenderRef ref="RollingFile"/>

? ? ? ? ? ? <AppenderRef ref="ErrorFile"/>

? ? ? ? </Root>

? ? </Loggers>

</configuration>

log4j2-prod.xml:修改logBase變量為~/prod/楞泼,其他同log4j2-test.xml

2、刪除log4j2-spring.xml

3笤闯、多環(huán)境配置日志文件

application-dev.yml增加配置節(jié)點(diǎn):

logging:

? config: classpath:log4j2-dev.xml

application-test.yml增加配置節(jié)點(diǎn):

logging:

? config: classpath:log4j2-test.xml

application-prod.yml增加配置節(jié)點(diǎn):

logging:

? config: classpath:log4j2-prod.xml

4现拒、修改環(huán)境變量,查看日志打印結(jié)果

IDEA中通過修改Active profiles來切換dev望侈、test和prod環(huán)境,可以看到不同的環(huán)境打印出的日志

使用traceId跟蹤請(qǐng)求全流程日志

線上我們一般采用多機(jī)部署勋桶,用kibana收集日志脱衙,但是在并發(fā)大的時(shí)候侥猬,使用日志定位問題比較麻煩,很難篩選出指定請(qǐng)求的全部相關(guān)日志捐韩。因此我們可以對(duì)日志打印做一個(gè)改造退唠,使用traceId跟蹤請(qǐng)求的全部路徑。

1荤胁、MDC簡(jiǎn)介

MDC:Mapped Diagnostic Context瞧预,映射調(diào)試上下文,它是 log4j 和 logback 提供的一種方便在多線程條件下記錄日志的功能仅政。MDC 中包含的內(nèi)容可以被同一線程中執(zhí)行的代碼所訪問垢油。當(dāng)前線程的子線程會(huì)繼承其父線程中的 MDC 的內(nèi)容。當(dāng)需要記錄日志時(shí)圆丹,只需要從 MDC 中獲取所需的信息即可滩愁。

2、創(chuàng)建AccessInterceptor

在com.tn666.demo目錄下創(chuàng)建interceptor文件夾辫封,在此文件夾下創(chuàng)建AccessInterceptor類文件:

public class AccessInterceptor implements HandlerInterceptor {

? ? @Override

? ? public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {

? ? ? ? String traceId = UUID.randomUUID().toString();

? ? ? ? MDC.put("traceId", traceId);

? ? ? ? return true;

? ? }

}

preHandle方法會(huì)在Controller處理之前進(jìn)行調(diào)用硝枉,我們?cè)谡?qǐng)求開始時(shí),向MDC中寫入了一個(gè)traceId倦微,這里主要說一下traceId的記錄妻味,更多攔截器的內(nèi)容,后續(xù)的文章中會(huì)詳細(xì)介紹

3欣福、創(chuàng)建MvcConfiguration

在com.tn666.demo.configuration文件夾下創(chuàng)建MvcConfiguration類文件:

@Configuration

public class MvcConfiguration implements WebMvcConfigurer {

? ? @Override

? ? public void addInterceptors(InterceptorRegistry registry) {

? ? ? ? registry.addInterceptor(new AccessInterceptor());

? ? }

}

4责球、讀取traceId

在 log4j 和 logback 的取值方式為:

%X{traceId}

在日志文件的PatternLayout中加入traceId的讀戎冈堋:

<PatternLayout pattern="[%d] [%X{traceId}] [%-5p] [%t] [%c] - %m%n"/>

5鸦致、日志打印

訪問接口,可以看到traceId的打印

從打印出的日志可以看出瓤漏,這是兩次http請(qǐng)求凿将,有兩個(gè)traceId

6校套、下游服務(wù)使用相同traceId

查找問題時(shí),有時(shí)候我們希望把一次請(qǐng)求串起來牧抵,包括調(diào)用第三方服務(wù)笛匙,這時(shí)候我們可以采用如下方法:

1)改造http調(diào)用工具

在發(fā)送http請(qǐng)求時(shí),自動(dòng)將traceId添加到header中

2)下游服務(wù)的攔截器修改

下游服務(wù)的攔截器犀变,首先從header中獲取traceId妹孙,寫入MDC中,若header中沒有traceId获枝,再使用UUID

文章中的示例代碼蠢正,可以在https://github.com/tunan66666/spring-boot-demo上查看

若您覺得還可以,請(qǐng)幫忙點(diǎn)個(gè)“”省店,謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嚣崭,一起剝皮案震驚了整個(gè)濱河市笨触,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雹舀,老刑警劉巖芦劣,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異说榆,居然都是意外死亡虚吟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門签财,熙熙樓的掌柜王于貴愁眉苦臉地迎上來串慰,“玉大人,你說我怎么就攤上這事荠卷∧B” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵油宜,是天一觀的道長(zhǎng)掂碱。 經(jīng)常有香客問我,道長(zhǎng)慎冤,這世上最難降的妖魔是什么疼燥? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蚁堤,結(jié)果婚禮上醉者,老公的妹妹穿的比我還像新娘。我一直安慰自己披诗,他們只是感情好撬即,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呈队,像睡著了一般剥槐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宪摧,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天粒竖,我揣著相機(jī)與錄音,去河邊找鬼几于。 笑死蕊苗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沿彭。 我是一名探鬼主播朽砰,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了锅移?” 一聲冷哼從身側(cè)響起熔掺,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎非剃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體推沸,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡备绽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鬓催。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肺素。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖宇驾,靈堂內(nèi)的尸體忽然破棺而出倍靡,到底是詐尸還是另有隱情,我是刑警寧澤课舍,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布塌西,位于F島的核電站,受9級(jí)特大地震影響筝尾,放射性物質(zhì)發(fā)生泄漏捡需。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一筹淫、第九天 我趴在偏房一處隱蔽的房頂上張望站辉。 院中可真熱鬧,春花似錦损姜、人聲如沸饰剥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汰蓉。三九已至,卻和暖如春逸尖,著一層夾襖步出監(jiān)牢的瞬間古沥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工娇跟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岩齿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓苞俘,卻偏偏與公主長(zhǎng)得像盹沈,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353