Log4j是Apache下的一開(kāi)源項(xiàng)目勺像,通過(guò)使用Log4j可以將日志信息打印到控制臺(tái)、文件等涡贱。我們也可以控制每一條日志的輸出格式咏删,通過(guò)定義每一條日志信息的級(jí)別能夠更加細(xì)致地控制日志的生成過(guò)程。那我們?cè)趕pringboot中應(yīng)該要怎么配置呢问词。
springboot:v2.4.1督函、java8
1、pom文件
<!-- springboot-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 去掉springboot默認(rèn)日志配置 -->
<exclusions>
<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激挪、log4j2.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!-- status="OFF"辰狡,可以去掉,它的含義為是否記錄log4j2本身的event信息垄分,默認(rèn)是OFF -->
<configuration status="OFF">
<!-- 定義下面的引用名 -->
<!--
自定義格式:
%t:線程名稱
%p:日志級(jí)別
%c:日志消息所在類名
%m:消息內(nèi)容
%M:輸出執(zhí)行方法
%d:發(fā)生時(shí)間宛篇,%d{yyyy-MM-dd HH:mm:ss,SSS},輸出類似:2018-10-18 22:10:28,921
%x: 輸出和當(dāng)前線程相關(guān)聯(lián)的NDC(嵌套診斷環(huán)境),尤其用到像java servlets這樣的多客戶多線程的應(yīng)用中薄湿。
%L:代碼中的行數(shù)
%n:換行
-->
<Properties>
<property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss z} %-5p %c{36} %L %M - %m%x%n</property>
<property name="file_name">logs/app.log</property>
<property name="file_info">logs/info.log</property>
<property name="rolling_file_name">logs/app-%d{yyyy-MM-dd}-%i.log.gz</property>
<property name="every_file_size">10M</property><!-- 日志切割的最小單位 -->
<property name="output_log_level">debug</property><!-- 日志輸出級(jí)別 -->
</Properties>
<!--先定義所有的appender-->
<!-- 日志級(jí)別
trace:追蹤叫倍,就是程序推進(jìn)一下,可以寫(xiě)個(gè)trace輸出
debug:調(diào)試豺瘤,一般作為最低級(jí)別吆倦,trace基本不用。
info:輸出重要的信息坐求,使用較多
warn:警告蚕泽,有些信息不是錯(cuò)誤信息,但也要給一些提示桥嗤。
error:錯(cuò)誤信息须妻。用的也很多仔蝌。
fatal:致命錯(cuò)誤。級(jí)別較高.
-->
<appenders>
<!--Appenders節(jié)點(diǎn)荒吏,常見(jiàn)的有三種子節(jié)點(diǎn):Console敛惊、RollingFile、File.-->
<!-- Console
name :給loggers調(diào)用
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只設(shè)置默認(rèn):SYSTEM_OUT.
-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制臺(tái)只輸出level及以上級(jí)別的信息(onMatch)司倚,其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"></ThresholdFilter>
<!--輸出日志的格式-->
<PatternLayout pattern="${log_pattern}"></PatternLayout>
</Console>
<!--File
fileName:指定輸出日志的目的文件帶全路徑的文件名.
append:決定是否添加還是重新建文件會(huì)打印出所有信息豆混,false這個(gè)log每次運(yùn)行程序會(huì)自動(dòng)清空,
-->
<File name="log" fileName="${file_name}" append="false" >
<PatternLayout pattern="${log_pattern}"></PatternLayout>
<!--輸出level及以上級(jí)別的信息(onMatch)动知,其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"></ThresholdFilter>
</File>
<File name="logss" fileName="${file_info}" append="false" >
<PatternLayout pattern="${log_pattern}"></PatternLayout>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"></ThresholdFilter>
</File>
<!--RollingFile
fileName:指定輸出日志的目的文件帶全路徑的文件名.
PatternLayout:輸出格式皿伺,不設(shè)置默認(rèn)為:%m%n.
filePattern:指定新建日志文件的名稱格式.
Policies:指定滾動(dòng)日志的策略,就是什么時(shí)候進(jìn)行新建日志文件輸出日志.
TimeBasedTriggeringPolicy:Policies子節(jié)點(diǎn)盒粮,基于時(shí)間的滾動(dòng)策略鸵鸥,interval屬性用來(lái)指定多久滾動(dòng)一次,默認(rèn)是1 hour丹皱。modulate=true用來(lái)調(diào)整時(shí)間:比如現(xiàn)在是早上3am妒穴,interval是4,那么第一次滾動(dòng)是在4am摊崭,接著是8am讼油,12am...而不是7am.
SizeBasedTriggeringPolicy:Policies子節(jié)點(diǎn),基于指定文件大小的滾動(dòng)策略呢簸,size屬性用來(lái)定義每個(gè)日志文件的大小.
DefaultRolloverStrategy:用來(lái)指定同一個(gè)文件夾下最多有幾個(gè)日志文件時(shí)開(kāi)始刪除最舊的矮台,創(chuàng)建新的(通過(guò)max屬性),默認(rèn)
這個(gè)會(huì)打印出所有的信息,每次大小超過(guò)size根时,則這size大小的日志會(huì)自動(dòng)存入按年份-月份建立的文件夾下面并進(jìn)行壓縮瘦赫,作為存檔
-->
<!-- 按月生成歸檔日志,可以使用 filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"
<RollingFile name="RollingFile" fileName="${file_name}"
filePattern="${rolling_file_name}">
<PatternLayout pattern="${log_pattern}"></PatternLayout>
<SizeBasedTriggeringPolicy size="${every_file_size}"></SizeBasedTriggeringPolicy>
</RollingFile>
-->
<!--如果需要配置多個(gè)Rollingfile地址蛤迎,還需要在root下添加appender-ref ref="RollingFile1"/>
<RollingFile name="RollingFile1" fileName="logs/app1.log"
filePattern="logs/app1-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"></PatternLayout>
<SizeBasedTriggeringPolicy size="10MB"></SizeBasedTriggeringPolicy>
</RollingFile>
-->
</appenders>
<!--定義logger
只有定義了logger并引入的appender确虱,appender才會(huì)生效
常見(jiàn)的有兩種:Root和Logger.
Root節(jié)點(diǎn)用來(lái)指定項(xiàng)目的根日志,如果沒(méi)有單獨(dú)指定Logger替裆,那么就會(huì)默認(rèn)使用該Root日志輸出
level:日志輸出級(jí)別校辩,共有8個(gè)級(jí)別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
AppenderRef:Root的子節(jié)點(diǎn)辆童,用來(lái)指定該日志輸出到哪個(gè)Appender.
Logger節(jié)點(diǎn)用來(lái)單獨(dú)指定日志的形式召川,比如要為指定包下的class指定不同的日志級(jí)別等。
level:日志輸出級(jí)別胸遇,共有8個(gè)級(jí)別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
name:用來(lái)指定該Logger所適用的類或者類所在的包全路徑,繼承自Root節(jié)點(diǎn).
AppenderRef:Logger的子節(jié)點(diǎn)汉形,用來(lái)指定該日志輸出到哪個(gè)Appender,
如果沒(méi)有指定纸镊,就會(huì)默認(rèn)繼承自Root.如果指定了倍阐,
那么會(huì)在指定的這個(gè)Appender和Root的Appender中都會(huì)輸出,
此時(shí)我們可以設(shè)置Logger的additivity="false"只在自定義的Appender中進(jìn)行輸出逗威。
-->
<loggers>
<!--建立一個(gè)默認(rèn)的root的logger峰搪,需要在root的level中指定輸出的級(jí)別,-->
<Root level="trace" includeLocation="true">
<AppenderRef ref="log"></AppenderRef>
<!-- <AppenderRef ref="Console"></AppenderRef> -->
</Root>
<!-- 異步日志在程序的classpath需要加載disruptor-3.0.0.jar或者更高的版本凯旭。
異步日志分為兩種:
a.全異步模式
這種異步日志方式概耻,不需要修改修改原理的配置文件,Logger仍然使用<root> and <logger>
只需要在主程序代碼開(kāi)頭罐呼,加一句系統(tǒng)屬性的代碼:
System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
b.異步和非異步混合輸出模式
在配置文件中Logger使用<asyncRoot> or <asyncLogger>
-->
</loggers>
</configuration>
①默認(rèn)配置文件名 log4j2-spring.xml鞠柄,一般放置在 src/main/resources 根目錄下即可 .
②如果自定義了文件名,需要在 application.properties 或者 application.yml 文件中配置:
// log4j2日志文件
logging.config=classpath:log4j2.xml