基于log4j2.properties踩坑與填坑
log4j2.properties踩坑與填坑
日志配置
門(mén)面模式:slf4j
日志庫(kù):log4j2
引入依賴(lài):compile('org.springframework.boot:spring-boot-starter-log4j2:2.0.4.RELEASE')
采坑
啟動(dòng)Application時(shí),出現(xiàn)Multiple bindings were found on the class path的問(wèn)題
- 坑點(diǎn):沒(méi)有排除對(duì)默認(rèn)logback的依賴(lài)
- 填坑:在build.gradle中加入:
configurations { compile.exclude module: 'spring-boot-starter-logging' }
啟動(dòng)后,沒(méi)有按照配置好的格式輸出
- 坑點(diǎn):沒(méi)有在application.[yml|properties]中聲明配置文件的路徑
- 填坑:在application.yml中加入
#指定log4j2配置文件的位置與名稱(chēng) logging: config: classpath:log4j2.properties
格式化日志輸出參數(shù)
%m
輸出代碼中指定的消息%p
輸出優(yōu)先級(jí),即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL%r
輸出自應(yīng)用啟動(dòng)到輸出該log信息耗費(fèi)的毫秒數(shù)%c
輸出所屬的類(lèi)目,通常就是所在類(lèi)的全名%t
輸出產(chǎn)生該日志事件的線程名%n
輸出一個(gè)回車(chē)換行符,Windows平臺(tái)為“rn”,Unix平臺(tái)為“n”%d
輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類(lèi)似:2002年10月18日 22:10:28,921%l
輸出日志事件的發(fā)生位置,包括類(lèi)目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main(TestLog4.java:10)%F
輸出日志消息產(chǎn)生時(shí)所在的文件名稱(chēng)%L
輸出代碼中的行號(hào)%x
輸出和當(dāng)前線程相關(guān)聯(lián)的NDC(嵌套診斷環(huán)境),像java servlets多客戶多線程的應(yīng)用中%%
輸出一個(gè)"%"字符
可以在%與模式字符之間加上修飾符來(lái)控制其最小寬度、最大寬度、和文本的對(duì)齊方式。如:
%5c
: 輸出category名稱(chēng),最小寬度是5,category<5,默認(rèn)的情況下右對(duì)齊%-5c
:輸出category名稱(chēng),最小寬度是5,category<5,"-"號(hào)指定左對(duì)齊,會(huì)有空格%.5c
:輸出category名稱(chēng),最大寬度是5,category>5,就會(huì)將左邊多出的字符截掉,<5不會(huì)有空格%20.30c
:category名稱(chēng)<20補(bǔ)空格,并且右對(duì)齊,>30字符,就從左邊交遠(yuǎn)銷(xiāo)出的字符截掉
記錄一份自己的配置文件
實(shí)現(xiàn)控制臺(tái)打印,以及基于時(shí)間和基于文件大小的本地保存策略。
name=PropertiesConfig # 定義變量。指定日志文件的位置和文件名稱(chēng),以便記錄多份日志時(shí),直接引用 property.fileName=qiyinzone property.fileDir=./logs property.filePath=${fileDir}/${fileName}.log appenders=console, rolling # rootLogger, 根記錄器,所有記錄器的父輩 # 指定根日志的級(jí)別 rootLogger.level=info # 指定輸出的appender引用 rootLogger.appenderRef.stdout.ref=Stdout rootLogger.appenderRef.rolling.ref=InfoRollingFile # console # 指定輸出源的類(lèi)型與名稱(chēng) appender.console.type=Console appender.console.name=Stdout appender.console.layout.type=PatternLayout # 輸出模板 appender.console.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue} # rolling file appender.rolling.type=RollingFile appender.rolling.name=InfoRollingFile appender.rolling.fileName=${filePath} # 指定當(dāng)發(fā)生Rolling時(shí),文件的轉(zhuǎn)移和重命名規(guī)則 appender.rolling.filePattern=${fileDir}/${fileName}_%d{yyyy-MM-dd}_%i.log appender.rolling.layout.type=PatternLayout appender.rolling.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue} # 指定記錄文件的封存策略,該策略主要是完成周期性的日志文件封存工作 appender.rolling.policies.type=Policies # 基于時(shí)間的觸發(fā)策略 appender.rolling.policies.time.type=TimeBasedTriggeringPolicy # 當(dāng)前記錄周期為每1h生成一個(gè)文件 appender.rolling.policies.time.interval=1 appender.rolling.policies.time.modulate=true # 基于日志文件體積的觸發(fā)策略 appender.rolling.policies.size.type=SizeBasedTriggeringPolicy # 當(dāng)日志文件體積大于size指定的值時(shí),觸發(fā)Rolling appender.rolling.policies.size.size=20M # 文件封存的覆蓋策略 appender.rolling.strategy.type=DefaultRolloverStrategy # 生成分割(封存)文件的個(gè)數(shù) appender.rolling.strategy.max=100
打印效果
打印時(shí),對(duì)不同level的日志定義了不同的字體顏色,方便定位。
%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}
Log4j2 properties配置文件
原工作組比較清閑,被臨時(shí)借調(diào)到新的工作組。組長(zhǎng)給了個(gè)任務(wù)是把Log4j的XML配置文件改成properties,原因是XML格式的看著不舒服。哈,以上不算吐槽,只是交待一下,為什么我要這么費(fèi)勁的使用properties做配置文件。
Log4j2 一開(kāi)始拋棄了properties配置文件格式,到2.4版本時(shí),又開(kāi)始支持properties配置文件格式。到2.6版本又有新的要求。我用的是寫(xiě)本文時(shí)的最近版本2.8
status = error property.LOG_HOME=/output/logs property.BACKUP_HOME=backup property.SERVER_NAME=buddie-Service property.EVERY_FILE_SIZE=10M property.OUTPUT_LOG_LEVEL=INFO property.FILE_MAX=10 appender.console.type = Console appender.console.name = STDOUT appender.console.layout.type = PatternLayout appender.console.layout.pattern = %m%n appender.rolling.type=RollingFile appender.rolling.name=RollingFileAll appender.rolling.filter.threshold.level = trace appender.rolling.filter.threshold.type = ThresholdFilter appender.rolling.fileName=${LOG_HOME}/dev_${SERVER_NAME}_all.log appender.rolling.filePattern=${LOG_HOME}/dev_${BACKUP_HOME}/dev_${SERVER_NAME}_all.%d{yyyy-MM-dd-HH}.log appender.rolling.layout.type=PatternLayout appender.rolling.layout.pattern=%d %p %C{1.} [%t] %m%n appender.rolling.policies.type=Policies appender.rolling.policies.time.type=TimeBasedTriggeringPolicy appender.rolling.policies.time.interval=2 appender.rolling.policies.time.modulate=true appender.rolling.policies.size.type=SizeBasedTriggeringPolicy appender.rolling.policies.size.size=${EVERY_FILE_SIZE} appender.rolling.strategy.type=DefaultRolloverStrategy appender.error.type=RollingFile appender.error.name=RollingFileError appender.error.filter.threshold.level = error appender.error.filter.threshold.type = ThresholdFilter appender.error.fileName=${LOG_HOME}/dev_${SERVER_NAME}_error.log appender.error.filePattern=${LOG_HOME}/dev_${BACKUP_HOME}/dev_${SERVER_NAME}_error.%d{yyyy-MM-dd-HH}.log appender.error.layout.type=PatternLayout appender.error.layout.pattern=%d %p %C{1.} [%t] %m%n appender.error.policies.type=Policies appender.error.policies.time.type=TimeBasedTriggeringPolicy appender.error.policies.time.interval=2 appender.error.policies.time.modulate=true appender.error.policies.size.type=SizeBasedTriggeringPolicy appender.error.policies.size.size=${EVERY_FILE_SIZE} appender.error.strategy.type=DefaultRolloverStrategy appender.charge.type=RollingFile appender.charge.name=RollingFileCharge appender.charge.filter.threshold.level = trace appender.charge.filter.threshold.type = ThresholdFilter appender.charge.fileName=${LOG_HOME}/dev_${SERVER_NAME}_charge.log appender.charge.filePattern=${LOG_HOME}/dev_${BACKUP_HOME}/dev_${SERVER_NAME}_charge.%d{yyyy-MM-dd-HH}.log appender.charge.layout.type=PatternLayout appender.charge.layout.pattern=%d %p %C{1.} [%t] %m%n appender.charge.policies.type=Policies appender.charge.policies.time.type=TimeBasedTriggeringPolicy appender.charge.policies.time.interval=2 appender.charge.policies.time.modulate=true appender.charge.policies.size.type=SizeBasedTriggeringPolicy appender.charge.policies.size.size=${EVERY_FILE_SIZE} appender.charge.strategy.type=DefaultRolloverStrategy logger.activity.name = buddie.activity logger.activity.level = debug logger.activity.additivity = false logger.activity.appenderRef.all.ref = RollingFileAll logger.activity.appenderRef.error.ref = RollingFileError logger.activity.appenderRef.stdout.ref = STDOUT logger.login.name = buddie.login logger.login.level = debug logger.login.additivity = false logger.login.appenderRef.all.ref = RollingFileAll logger.login.appenderRef.error.ref = RollingFileError logger.login.appenderRef.stdout.ref = STDOUT logger.charge.name = buddie.charge logger.charge.level = trace logger.charge.additivity = false logger.charge.appenderRef.all.ref = RollingFileAll logger.charge.appenderRef.error.ref = RollingFileError logger.charge.appenderRef.charge.ref = RollingFileCharge logger.charge.appenderRef.stdout.ref = STDOUT rootLogger.level = info rootLogger.appenderRef.stdout.ref = STDOUT rootLogger.appenderRef.all.ref = RollingFileAll rootLogger.appenderRef.error.ref = RollingFileError
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java對(duì)接支付寶支付項(xiàng)目的實(shí)戰(zhàn)記錄
最近公司有一個(gè)需求是接入第三方支付(微信&支付寶),我接到了支付寶支付,所以下面這篇文章主要給大家介紹了關(guān)于java對(duì)接支付寶支付項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2022-06-06Java實(shí)現(xiàn)導(dǎo)出Word文檔的示例代碼
poi-tl是一個(gè)基于Apache POI的Word模板引擎,也是一個(gè)免費(fèi)開(kāi)源的Java類(lèi)庫(kù),你可以非常方便的加入到你的項(xiàng)目中。本文就利用它實(shí)現(xiàn)導(dǎo)出Word文檔功能,需要的可以參考一下2023-02-02SpringBoot實(shí)現(xiàn)自定義線程池的方法
這篇文章主要介紹了SpringBoot中的自定義線程池解析,實(shí)現(xiàn)自定義線程池重寫(xiě)spring默認(rèn)線程池的方式使用的時(shí)候,只需要加@Async注解就可以,不用去聲明線程池類(lèi),需要的朋友可以參考下2023-11-11詳解SpringMVC 基礎(chǔ)教程 簡(jiǎn)單入門(mén)實(shí)例
這篇文章主要介紹了詳解SpringMVC 基礎(chǔ)教程 簡(jiǎn)單入門(mén)實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12springboot中如何去整合shrio實(shí)例分享
這篇文章主要介紹了springboot中如何去整合shrio實(shí)例分享的相關(guān)資料,需要的朋友可以參考下2023-08-08Java設(shè)計(jì)模式之觀察者模式原理與用法詳解
這篇文章主要介紹了Java設(shè)計(jì)模式之觀察者模式,結(jié)合實(shí)例形式詳細(xì)分析了Java設(shè)計(jì)模式之觀察者模式基本概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-06-06