log4j2的異步使用及添加自定義參數(shù)方式_第1頁
log4j2的異步使用及添加自定義參數(shù)方式_第2頁
log4j2的異步使用及添加自定義參數(shù)方式_第3頁
log4j2的異步使用及添加自定義參數(shù)方式_第4頁
log4j2的異步使用及添加自定義參數(shù)方式_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第log4j2的異步使用及添加自定義參數(shù)方式目錄log4j2異步使用及添加自定義參數(shù)添加依賴(這里省略了版本號)下面寫一個生產(chǎn)可用的log4j2.xml的模板補充知識自定義日志格式如何在日志中添加自己想傳的參數(shù)?log4j輸入自定義參數(shù)測試代碼如下

log4j2異步使用及添加自定義參數(shù)

關(guān)于log4j2的性能和原理就不贅述了,這篇主要講使用,配置文件解讀,和添加自定義參數(shù),偏應(yīng)用的一篇文章。

相比與其他的日志系統(tǒng),log4j2丟數(shù)據(jù)這種情況少;disruptor技術(shù),在多線程環(huán)境下,性能高于logback等10倍以上;利用jdk1.5并發(fā)的特性,減少了死鎖的發(fā)生;

目前看來,log4j2的性能最突出。

添加依賴(這里省略了版本號)

dependency

groupIdorg.springframework.boot/groupId

artifactIdspring-boot-starter-web/artifactId

exclusions!--去掉springboot默認(rèn)配置--

exclusion

groupIdorg.springframework.boot/groupId

artifactIdspring-boot-starter-logging/artifactId

/exclusion

/exclusions

/dependency

dependency!--引入log4j2依賴--

groupIdorg.springframework.boot/groupId

artifactIdspring-boot-starter-log4j2/artifactId

/dependency

然后再各個項目中添加文件log4j2.xml,在要使用的類上添加@slf4j注解(lombok的),即可使用log對象。

log4j2.0與以往的1.x有一個明顯的不同,其配置文件只能采用.xml,.json或者.jsn。在默認(rèn)情況下,系統(tǒng)選擇configuration文件的優(yōu)先級如下:(classpath為src文件夾)

classpath下名為log4j-test.json或者log4j-test.jsn文件

classpath下名為log4j2-test.xml

classpath下名為log4j.json或者log4j.jsn文件

classpath下名為log4j2.xml

level:日志輸出級別,共有8個級別,按照從低到高為:AllTraceDebugInfoWarnErrorFatalOFF.

下面寫一個生產(chǎn)可用的log4j2.xml的模板

xmlversion="1.0"encoding="UTF-8"

!--Configuration后面的status,這個用于設(shè)置log4j2自身內(nèi)部的信息輸出,可以不設(shè)置,當(dāng)設(shè)置成trace時,你會看到log4j2內(nèi)部各種詳細(xì)輸出--

!--monitorInterval:Log4j能夠自動檢測修改配置文件和重新配置本身,設(shè)置間隔秒數(shù)--

configurationstatus="WARN"

Properties

!--常用變量配置供下文中使用--

propertyname="APP_NAME"項目名稱/property

propertyname="LOGGER_LEVEL"INFO/property

!--日志路徑對應(yīng)服務(wù)器路徑--

propertyname="LOGGER_PATH"/data/logs/property

Propertyname="LOG_HOME"${LOGGER_PATH}/${APP_NAME}/Property

!--文件大小--

Propertyname="FILE_SIZE"10M/Property

!--日志格式--

Propertyname="log_pattern"%d{yyyy-MM-ddHH:mm:ss.SSS}[%thread][%X{traceId}]%-5level%logger{36}-%msg%n/Property

!--日志文件命名格式--

Propertyname="rolling_file_name"-%d{yyyy-MM-dd}.%i.zip/Property

!--日志留存最大文件數(shù)--

Propertyname="rollover_strategy_max"30/Property

Propertyname="LOG_HOME_PROJECT"${LOG_HOME}/${APP_NAME}-project/Property

Propertyname="LOG_HOME_PROJECT_ERROR"${LOG_HOME}/${APP_NAME}-project-error/Property

Propertyname="LOG_HOME_SQL"${LOG_HOME}/${APP_NAME}-sql/Property

/Properties

appenders

!--控制臺打印及格式--

Consolename="Console"target="SYSTEM_OUT"

PatternLayoutpattern="${log_pattern}"/

/Console

!--定義rolling()供下文使用--

RollingRandomAccessFilename="projectRolling"

fileName="${LOG_HOME_PROJECT}.log"

filePattern="${LOG_HOME_PROJECT}${rolling_file_name}"

immediateFlush="false"append="true"

PatternLayout

Pattern${log_pattern}/Pattern

CharsetUTF-8/Charset

/PatternLayout

Policies

!--滾動規(guī)則時間或者文件大小滾動后將按照filePattern命名--

!--interval屬性用來指定多久滾動一次,默認(rèn)是1hour--

TimeBasedTriggeringPolicyinterval="24"/

SizeBasedTriggeringPolicysize="${FILE_SIZE}"/

/Policies

DefaultRolloverStrategymax="${rollover_strategy_max}"/

/RollingRandomAccessFile

RollingRandomAccessFilename="projectErrorRolling"

fileName="${LOG_HOME_PROJECT_ERROR}.log"

filePattern="${LOG_HOME_PROJECT_ERROR}${rolling_file_name}"

immediateFlush="false"append="true"

Filters

!--只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)可以使用多個ThresholdFilter達(dá)到精準(zhǔn)過濾某個級別的日志--

ThresholdFilterlevel="${LOGGER_LEVEL}"onMatch="ACCEPT"onMismatch="DENY"/

/Filters

PatternLayout

Pattern${log_pattern}/Pattern

CharsetUTF-8/Charset

/PatternLayout

Policies

SizeBasedTriggeringPolicysize="${FILE_SIZE}"/

/Policies

DefaultRolloverStrategymax="${rollover_strategy_max}"/

/RollingRandomAccessFile

/RollingRandomAccessFile

RollingRandomAccessFilename="sqlRolling"

fileName="${LOG_HOME_SQL}.log"

filePattern="${LOG_HOME_SQL}${rolling_file_name}"

immediateFlush="false"append="true"

PatternLayout

Pattern${log_pattern}/Pattern

CharsetUTF-8/Charset

/PatternLayout

Policies

SizeBasedTriggeringPolicysize="${FILE_SIZE}"/

/Policies

DefaultRolloverStrategymax="${rollover_strategy_max}"/

/RollingRandomAccessFile

/appenders

!--Logger節(jié)點用來單獨指定日志的形式,比如要為指定包下的class指定不同的日志級別等。--

loggers

!--異步日志區(qū)別于普通使用的loggerroot搭配--

!--name為包名對應(yīng)配置日志輸出等級level--

!--若是additivity設(shè)為false,則子Logger只會在自己的appender里輸出,而不會在父Logger的appender里輸出。--

!--將org.springframework包下的日志打印到Console控制臺,projectRolling文件,projectErrorRolling(error級別單獨一個文件)--

AsyncLoggername="org.springframework"level="${LOGGER_LEVEL}"additivity="false"

appender-refref="Console"/

appender-refref="projectRolling"/

appender-refref="projectErrorRolling"/

/AsyncLogger

AsyncLoggername="com.alibaba.dubbo"level="${LOGGER_LEVEL}"additivity="false"

appender-refref="Console"/

appender-refref="projectRolling"/

appender-refref="projectErrorRolling"/

/AsyncLogger

AsyncLoggername="druid.sql"level="${LOGGER_LEVEL}"additivity="false"

appender-refref="Console"/

appender-refref="sqlRolling"/

/AsyncLogger

AsyncLoggername="org.mybatis"level="${LOGGER_LEVEL}"additivity="false"

appender-refref="Console"/

appender-refref="sqlRolling"/

/AsyncLogger

AsyncLoggername="com.項目包名"level="${LOGGER_LEVEL}"additivity="false"

appender-refref="Console"/

appender-refref="projectRolling"/

appender-refref="projectErrorRolling"/

/AsyncLogger

AsyncRootlevel="${LOGGER_LEVEL}"

appender-refref="Console"/

appender-refref="projectRolling"/

appender-refref="projectErrorRolling"/

/AsyncRoot

/loggers

/configuration

如上配置會產(chǎn)生3個日志文件

項目名稱-project.log

項目名稱-project-error.log

項目名稱-sql.log

補充知識

onMatch和onMismatch都有三個屬性值,分別為Accept、DENY和NEUTRAL

分別介紹這兩個配置項的三個屬性值:

onMatch=“ACCEPT”表示匹配該級別及以上

onMatch=“DENY”表示不匹配該級別及以上

onMatch=“NEUTRAL”表示該級別及以上的,由下一個filter處理,如果當(dāng)前是最后一個,則表示匹配該級別及以上

onMismatch=“ACCEPT”表示匹配該級別以下

onMismatch=“NEUTRAL”表示該級別及以下的,由下一個filter處理,如果當(dāng)前是最后一個,則不匹配該級別以下的

onMismatch=“DENY”表示不匹配該級別以下的

自定義日志格式

%d{HH:mm:ss.SSS}表示輸出到毫秒的時間

%logger{36}簡單理解為類名

%thread輸出當(dāng)前線程名稱

%-5level輸出日志級別,-5表示左對齊并且固定輸出5個字符,如果不足在右邊補0

%logger輸出logger名稱,因為RootLogger沒有名稱,所以沒有輸出

%msg日志文本

%n換行

%X{xxx}xxx為自定義參數(shù)

如何在日志中添加自己想傳的參數(shù)?

定義攔截器(web服務(wù)攔controller,dubbo服務(wù)攔api),每次請求過來,攔住,然后將自定義參數(shù)傳入。至于自定義參數(shù)怎么存,就是另一個問題了。

eg:traceId跟蹤號對應(yīng)log4j2.xml中的%X{traceId}

下面是關(guān)鍵代碼:

publicclassContextFilterimplementsFilter{

@Override

publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{

StringtraceId=UUID.randomUUID().toString().replaceAll("-","");

//org.slf4j.MDC

MDC.put(CommonConsts.TRACE_ID_LOG,traceId);//用來給日志文件使用

//org.apache.logging.log4j.ThreadContext

ThreadContext.put(CommonConsts.TRACE_ID_LOG,traceId);//經(jīng)測試,這兩行都可行。

filterChain.doFilter(servletRequest,servletResponse);

最后的日志打印效果如下:

2025-05-2912:04:30.122[http-nio-8080-exec-2][2333333]INFOcom.core.web.filter.ContextFilter-接口調(diào)用時間:245毫秒

log4j輸入自定義參數(shù)

使用log4j、log4j2輸入日志時,有時想追加打印自定義參數(shù)(比如客戶端環(huán)境:手機型號、瀏覽器數(shù)據(jù),request數(shù)據(jù)、用戶數(shù)據(jù)等),以便于快速定位問題所在。

亦或在多線程環(huán)境中,快速定位哪些日志是由同一用戶輸出,便于其他工具進(jìn)行日志分析。

log4j提供了ThreadContext線程上下文類,用于存儲自定義數(shù)據(jù),以便在輸入日志時,包含指定數(shù)據(jù)。

測試代碼如下

packagecom.howtodoinjava.log4j2.examples;

importjava.util.UUID;

importorg.apache.logging.log4j.LogManager;

importorg.apache.logging.log4j.Logge

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論