1、log4j2 簡(jiǎn)介
????????Apache Log4j2是對(duì)Log4j的升級(jí),它比其前身Log4j 1.x提供了重大改進(jìn),并提供了Logback中可用的許多改進(jìn),同時(shí)修復(fù)了Logback架構(gòu)中的一些問題。被譽(yù)為是目前最優(yōu)秀的Java日志框架。
2、項(xiàng)中引入 log4j2 的方式
2.1、springboot 項(xiàng)目中
<!-- spring-boot-starter 默認(rèn)引入logback 需要排除 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions><!-- SpringBoot 默認(rèn)攜帶自身的 log 日志功能,去掉默認(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.2、普通 java 項(xiàng)目中
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.6.2</version>
</dependency>
<!---------------log4j與slf4j集成----------------->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.6.2</version>
</dependency>
3、在項(xiàng)目中指定 log4j2 的配置文件
? ? ? ? 如果 log4j2 框架使用的是 springboot 默認(rèn)的命名方式?log4j2-spring.xml ,則不需要配置,直接在項(xiàng)目的 resources 目錄下創(chuàng)建?log4j2-spring.xml 文件即可;如果使用自定義命名的方式,需要在項(xiàng)目的配置文件中 application.yml 中添加以下配置。
logging:
config: classpath:my_log4j2.xml
4、log4j2 配置文件詳解
4.1、configuration 標(biāo)簽
<configuration status="WARN" monitorInterval="30">
status:記錄到控制臺(tái)的內(nèi)部Log4j事件的級(jí)別。此屬性的有效值為 trace, debug, info, warn, error, fatal”。
monitorInterval: 從文件配置后,Log4j能夠自動(dòng)檢測(cè)對(duì)配置文件的更改并自行重新配置。以便僅在至少30秒之后檢查配置文件的更改。默認(rèn)為5秒。
4.2、Properties 標(biāo)簽
????????Properties 標(biāo)簽定義全局屬性,name屬性必須存在且唯一,允許使用${name}來(lái)引用該變量。
<Properties>
<Property name="LOG_HOME">../logs/xxx</Property>
</Properties>
4.3、Appenders 標(biāo)簽
4.3.1、日志輸出到控制臺(tái)(Console 標(biāo)簽)
有幾個(gè)參數(shù):
name:指定Appender的名字;
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只設(shè)置默認(rèn):SYSTEM_OUT;
PatternLayout:輸出格式,不設(shè)置默認(rèn)為:%m%n。
<!--Console:日志輸出到控制臺(tái)標(biāo)準(zhǔn)輸出 -->
<Console name="Console" target="SYSTEM_OUT">
<!-- 添加過濾器,只接受程序中DEBUG級(jí)別的日志進(jìn)行處理-->
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<!--pattern:日期,線程名,日志級(jí)別,日志名稱,日志信息,換行 -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%L] - %msg%n" />
</Console>
4.3.2、日志輸出到文件(File 標(biāo)簽)
有以下幾個(gè)參數(shù):
name:指定Appender的名字;
fileName:指定輸出日志的目的文件帶全路徑的文件名;
append:是否追加,默認(rèn)為
PatternLayout:輸出格式,不設(shè)置默認(rèn)為:%m%n。
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
4.3.3、滾動(dòng)日志輸出到文件(RollingFile 標(biāo)簽)
有以下幾個(gè)參數(shù):
name:指定Appender的名字。
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 小時(shí)。modulate=true用來(lái)對(duì)備份日志的生成時(shí)間糾偏,糾偏以0為基準(zhǔn)進(jìn)行,"0+interval"決定啟動(dòng)后第一次備份時(shí)間;
SizeBasedTriggeringPolicy:Policies 子節(jié)點(diǎn),基于指定文件大小的滾動(dòng)策略,size 屬性用來(lái)定義每個(gè)日志文件的大??;
DefaultRolloverStrategy:用來(lái)指定同一個(gè)文件夾下最多有幾個(gè)日志文件時(shí)開始刪除最舊的,創(chuàng)建新的(通過 max 屬性)。
<!--RollingFile:日志輸出到文件,下面的文件都使用相對(duì)路徑 -->
<!--fileName:當(dāng)前日志輸出的文件名稱 -->
<!--filePattern:備份日志文件名稱,備份目錄為logs下面以年月命名的目錄,備份時(shí)使用gz格式壓縮 -->
<RollingFile name="RollingFile" fileName="${LOG_HOME}/${FILE_NAME}.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%L] - %msg%n" />
<!--Policies:觸發(fā)策略決定何時(shí)執(zhí)行備份 -->
<Policies>
<!--TimeBasedTriggeringPolicy:日志文件按照時(shí)間備份 -->
<!--interval:每1天生成一個(gè)新文件,時(shí)間單位需要結(jié)合filePattern時(shí)間%d{yyyy-MM-dd} -->
<!--同理,如果要每1小時(shí)生成一個(gè)新文件,則改成%d{yyyy-MM-ddHH} -->
<!--modulate:對(duì)備份日志的生成時(shí)間糾偏,糾偏以0為基準(zhǔn)進(jìn)行,"0+interval"決定啟動(dòng)后第一次備份時(shí)間 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!--SizeBasedTriggeringPolicy:日志文件按照大小備份 -->
<!--size:指定日志文件最大為100MB,單位可以為KB、MB或GB -->
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
<!-- DefaultRolloverStrategy:翻轉(zhuǎn)策略決定如何執(zhí)行備份 -->
<!--max:最多保存5個(gè)備份文件,結(jié)合時(shí)間使用后,在每個(gè)時(shí)間段內(nèi)最多有5個(gè)備份,多出來(lái)的會(huì)被覆蓋 -->
<!-- compressionLevel:配置日志壓縮級(jí)別,范圍0-9,0不壓縮,1壓縮速度最快,9壓縮率最好,目前只對(duì)于zip壓縮文件類型有效 -->
<DefaultRolloverStrategy max="5" compressionLevel="1">
<!--Delete: 刪除匹配到的過期備份文件 -->
<!--maxDepth: 由于備份文件保存在${LOG_HOME}/$${date:yyyy-MM},所以目錄深度設(shè)置為2 -->
<Delete basePath="${LOG_HOME}" maxDepth="2">
<!--IfFileName:匹配文件名稱 -->
<!--glob:匹配2級(jí)目錄深度下的以.log.gz結(jié)尾的備份文件 -->
<IfFileName glob="*/*.log.gz" />
<!--IfLastModified:匹配文件修改時(shí)間 -->
<!--age:匹配超過180天的文件,單位D、H、M、S分別表示天、小時(shí)、分鐘、秒-->
<IfLastModified age="180D" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
4.4、loggers 節(jié)點(diǎn)
????????常見的有兩種:Root 和 Logger。
4.4.1、root 標(biāo)簽
????????Root 節(jié)點(diǎn)用來(lái)指定項(xiàng)目的根日志,如果沒有單獨(dú)指定 Logger,那么就會(huì)默認(rèn)使用該 Root 日志輸出。
level:日志輸出級(jí)別;
AppenderRef:Root 的子節(jié)點(diǎn),用來(lái)指定該日志輸出到哪個(gè) Appender。
4.4.2、logger 標(biāo)簽
????????Logger 節(jié)點(diǎn)用來(lái)單獨(dú)指定日志的形式,比如要為指定包下的class指定不同的日志級(jí)別等。
????????level:日志輸出級(jí)別;
????????name:用來(lái)指定該 Logger 所適用的類或者類所在的包全路徑,繼承自Root節(jié)點(diǎn);????????
????????AppenderRef:Logger 的子節(jié)點(diǎn),用來(lái)指定該日志輸出到哪個(gè) Appender,如果沒有指定,就會(huì)默認(rèn)繼承自 Root。如果指定了,那么會(huì)在指定的這個(gè) Appender 和 Root 的 Appender 中都會(huì)輸出,此時(shí)我們可以設(shè)置 Logger 的 additivity="false" 只在自定義的 Appender 中進(jìn)行輸出。
4.5、Filter 標(biāo)簽
?????????允許在以下四個(gè)位置中指定過濾器:由全局到局部依次是 configuration,Logger ,Appender ,Appender Reference。注意:全局 Filter 標(biāo)簽?Filters 放在?properties 標(biāo)簽之后。
常用的 filter:
1)、CompositeFilter : 組合模式,用以向外界提供統(tǒng)一的訪問接口。
2)、ThresholdFilter : 這個(gè)Filter負(fù)責(zé)按照所配置的日志級(jí)別過濾日志,等于或超出所配置級(jí)別的日志將返回onMatch結(jié)果。
3)、 LevelRangeFilter : 這個(gè)Filter也是負(fù)責(zé)按照日志級(jí)別過濾日志,只是相比較于ThresholdFilter,它比較的是指定區(qū)間范圍。這里有一個(gè)需要密切注意就是其兩個(gè)參數(shù)minLevel,maxLevel的配置;如果想要只保留WARN到ERROR級(jí)別的日志,那么應(yīng)該如下配置:
<!-- 危險(xiǎn)級(jí)別高的等級(jí)配置 作為minLevel的值 -->
<LevelRangeFilter minLevel="ERROR" maxLevel="WARN" onMatch="ACCEPT">
</LevelRangeFilter>
4)、 DynamicThresholdFilter :這個(gè)Filter允許依據(jù)ThreadContext中是否存在特定的某些值,以及日志級(jí)別來(lái)過濾LOG。
?
<Configuration status="TRACE" monitorInterval="5" packages="com.kanq.extend.cat.log4j2">
<Filters>
<!-- 全局級(jí)別Filter -->
<LevelRangeFilter minLevel="DEBUG" maxLevel="ERROR" onMatch="DENY"></LevelRangeFilter>
</Filters>
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
<!-- Appender級(jí)別的Filter -->
<BurstFilter level="INFO" rate="16" maxBurst="100"/>
<PatternLayout>
<pattern>%d %p %c{1.} [%t] %m%n</pattern>
</PatternLayout>
<TimeBasedTriggeringPolicy />
</RollingFile>
</Appenders>
<Loggers>
<!-- Logger級(jí)別的Filter -->
<Root level="error">
<MapFilter onMatch="ACCEPT" onMismatch="NEUTRAL" operator="or">
<KeyValuePair key="eventId" value="Login"/>
<KeyValuePair key="eventId" value="Logout"/>
</MapFilter>
</Root>
<Logger name="TestJavaScriptFilter" level="trace" additivity="false">
<!-- AppenderRef級(jí)別的Filter -->
<AppenderRef ref="List">
<ScriptFilter onMatch="ACCEPT" onMisMatch="DENY">
<ScriptRef ref="filter.js" />
</ScriptFilter>
</AppenderRef>
</Logger>
</Loggers>
</Configuration>
4.6、指定使用的激活環(huán)境
????????在某個(gè) appender 上添加?SpringProfile 標(biāo)簽,設(shè)置使用當(dāng)前 appender 的激活環(huán)境。
<SpringProfile name="dev | staging">
<Console name="Out">
<PatternLayout pattern="%m%n"/>
</Console>
</SpringProfile>
5、log4j2-spring.xml 文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--Configuration后面的status,這個(gè)用于設(shè)置log4j2自身內(nèi)部的信息輸出,可以不設(shè)置,當(dāng)設(shè)置成trace時(shí),你會(huì)看到log4j2內(nèi)部各種詳細(xì)輸出-->
<!--monitorInterval:Log4j能夠自動(dòng)檢測(cè)修改配置 文件和重新配置本身,設(shè)置間隔秒數(shù)-->
<configuration status="debug" monitorInterval="5">
<!--日志級(jí)別以及優(yōu)先級(jí)排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--變量配置-->
<Properties>
<!-- 格式化輸出:%date表示日期,%thread表示線程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度 %msg:日志消息,%n是換行符-->
<!-- %logger{36} 表示 Logger 名字最長(zhǎng)36個(gè)字符
%date{YYYY:MM:dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %l - %msg%n -->
<property name="LOG_PATTERN" value="%date{YYYY:MM:dd HH:mm:ss.SSS} [%thread] %-5level %l -%M - %msg%n"/>
<!-- 定義日志存儲(chǔ)的路徑 -->
<property name="FILE_PATH" value="D:\logs"/>
</Properties>
<appenders>
<!--控制臺(tái)日志輸出-->
<console name="Console" target="SYSTEM_OUT">
<!--運(yùn)行日志輸入文件-->
<!--<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>-->
<!--日志的格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--控制臺(tái)只輸出level及其以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<!--控制臺(tái)輸出日志格式-->
<!--<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>-->
</console>
<!--
debug 運(yùn)行時(shí)異常日志信息
-->
<RollingFile name="debugJournal" fileName="${FILE_PATH}/堆棧日志.log"
filePattern="logs/$${date:yyyy-MM-dd}/debug-%d{yyyy-MM-dd}-%i.log">
<!--文件只輸出level及以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<!--日志消息輸出格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--日志拆分規(guī)則-->
<Policies>
<!--在系統(tǒng)啟動(dòng)時(shí),生成一個(gè)新的日志文件-->
<OnStartupTriggeringPolicy/>
<!--interval屬性用來(lái)指定多久滾動(dòng)一次,默認(rèn)是1 hour-->
<TimeBasedTriggeringPolicy interval="0.001"/>
<SizeBasedTriggeringPolicy size="10 Kb"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認(rèn)為最多同一文件夾下10個(gè)文件開始覆蓋-->
<DefaultRolloverStrategy max="30"/>
</RollingFile>
<RollingFile name="infoJournal" fileName="${FILE_PATH}/運(yùn)行日志.log"
filePattern="logs/$${date:yyyy-MM-dd}/run-%d{yyyy-MM-dd}-%i.log">
<!--文件只輸出level及以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="fatal" onMatch="ACCEPT" onMismatch="DENY"/>
<!--日志消息輸出格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--日志拆分規(guī)則-->
<Policies>
<!--在系統(tǒng)啟動(dòng)時(shí),生成一個(gè)新的日志文件-->
<OnStartupTriggeringPolicy/>
<!--interval屬性用來(lái)指定多久滾動(dòng)一次,默認(rèn)是1 hour-->
<TimeBasedTriggeringPolicy interval="0.001"/>
<SizeBasedTriggeringPolicy size="10 KB"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認(rèn)為最多同一文件夾下10個(gè)文件開始覆蓋-->
<DefaultRolloverStrategy max="30"/>
</RollingFile>
</appenders>
<!--Logger節(jié)點(diǎn)用來(lái)單獨(dú)指定日志的形式,比如要為指定包下的class指定不同的日志級(jí)別等。-->
<!--然后定義loggers,只有定義了logger并引入的appender,appender才會(huì)生效-->
<loggers>
<!--過濾掉spring和mybatis的一些無(wú)用的信息-->
<logger name="org.mybatis" level="info" additivity="false">
<AppenderRef ref="Console"/>
</logger>
<!--監(jiān)控系統(tǒng)信息-->
<!--若是additivity設(shè)為false,則子Logger只會(huì)在自己的appender里輸出,不會(huì)在父Logger里輸出。-->
<Logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="infoJournal"/>
<appender-ref ref="debugJournal"/>
</root>
</loggers>
</configuration>
6、日志配置信息的符號(hào)解釋
-X號(hào) # X信息輸出時(shí)左對(duì)齊;
%p # 輸出日志信息優(yōu)先級(jí),即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL,
%d # 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%r # 輸出自應(yīng)用啟動(dòng)到輸出該log信息耗費(fèi)的毫秒數(shù)
%c # 輸出日志信息所屬的類目,通常就是所在類的全名
%t # 輸出產(chǎn)生該日志事件的線程名
%l # 輸出日志事件的發(fā)生位置,相當(dāng)于%C.%M(%F:%L)的組合,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main (TestLog4.java:10)
%x # 輸出和當(dāng)前線程相關(guān)聯(lián)的NDC(嵌套診斷環(huán)境),尤其用到像java servlets這樣的多客戶多線程的應(yīng)用中。
%% # 輸出一個(gè)"%"字符
%F # 輸出日志消息產(chǎn)生時(shí)所在的文件名稱
%L # 輸出代碼中的行號(hào)
%m # 輸出代碼中指定的消息,產(chǎn)生的日志具體信息
%n # 輸出一個(gè)回車換行符,Windows平臺(tái)為"/r/n",Unix平臺(tái)為"/n"輸出日志信息換行
可以在%與模式字符之間加上修飾符來(lái)控制其最小寬度、最大寬度、和文本的對(duì)齊方式。如:
1) %20c # 指定輸出全類名最小的寬度是20,如果全類名小于20的話,默認(rèn)的情況下右對(duì)齊。
2) %-20c # 指定輸出全類名最小的寬度是20,如果全類名小于20的話,"-"號(hào)指定左對(duì)齊。
3) %.30c # 指定輸出全類名最小的寬度是30,如果全類名大于30的話,就會(huì)將左邊多出的字符截掉,但小于30的話也不會(huì)有空格。
4) %20.30c # 如果全類名小于20就補(bǔ)空格,并且右對(duì)齊,如果其名稱長(zhǎng)于30字符,就從左邊較遠(yuǎn)輸出的字符截掉
總結(jié):log4j2 日志框架是基于 log4j 和 logback 的升級(jí),是當(dāng)前應(yīng)用最為廣泛的一種框架,以上詳解足以完成開發(fā)需求,更加詳細(xì)配置請(qǐng)參考:Log4j – Configuring Log4j 2。
????????本人是一個(gè)從小白自學(xué)計(jì)算機(jī)技術(shù),對(duì)運(yùn)維、后端、各種中間件技術(shù)、大數(shù)據(jù)等有一定的學(xué)習(xí)心得,想獲取自學(xué)總結(jié)資料(pdf版本)或者希望共同學(xué)習(xí),關(guān)注微信公眾號(hào):it自學(xué)社團(tuán)。后臺(tái)回復(fù)相應(yīng)技術(shù)名稱/技術(shù)點(diǎn)即可獲得。(本人學(xué)習(xí)宗旨:學(xué)會(huì)了就要免費(fèi)分享)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-791742.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-791742.html
到了這里,關(guān)于springboot 日志管理之 log4j2的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!