您好,登錄后才能下訂單哦!
這篇文章主要介紹基于log4j2.properties踩坑與填坑的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
門面模式:slf4j
日志庫:log4j2
引入依賴:compile('org.springframework.boot:spring-boot-starter-log4j2:2.0.4.RELEASE')
啟動Application時,出現Multiple bindings were found on the class path的問題
坑點:沒有排除對默認logback的依賴
填坑:在build.gradle中加入:
configurations { compile.exclude module: 'spring-boot-starter-logging' }
啟動后,沒有按照配置好的格式輸出
坑點:沒有在application.[yml|properties]中聲明配置文件的路徑
填坑:在application.yml中加入
#指定log4j2配置文件的位置與名稱 logging: config: classpath:log4j2.properties
%m
輸出代碼中指定的消息
%p
輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
%r
輸出自應用啟動到輸出該log信息耗費的毫秒數
%c
輸出所屬的類目,通常就是所在類的全名
%t
輸出產生該日志事件的線程名
%n
輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n”
%d
輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%l
輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10)
%F
輸出日志消息產生時所在的文件名稱
%L
輸出代碼中的行號
%x
輸出和當前線程相關聯的NDC(嵌套診斷環境),像java servlets多客戶多線程的應用中
%%
輸出一個"%"字符
可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。如:
%5c
: 輸出category名稱,最小寬度是5,category<5,默認的情況下右對齊
%-5c
:輸出category名稱,最小寬度是5,category<5,"-"號指定左對齊,會有空格
%.5c
:輸出category名稱,最大寬度是5,category>5,就會將左邊多出的字符截掉,<5不會有空格
%20.30c
:category名稱<20補空格,并且右對齊,>30字符,就從左邊交遠銷出的字符截掉
實現控制臺打印,以及基于時間和基于文件大小的本地保存策略。
name=PropertiesConfig # 定義變量。指定日志文件的位置和文件名稱,以便記錄多份日志時,直接引用 property.fileName=qiyinzone property.fileDir=./logs property.filePath=${fileDir}/${fileName}.log appenders=console, rolling # rootLogger, 根記錄器,所有記錄器的父輩 # 指定根日志的級別 rootLogger.level=info # 指定輸出的appender引用 rootLogger.appenderRef.stdout.ref=Stdout rootLogger.appenderRef.rolling.ref=InfoRollingFile # console # 指定輸出源的類型與名稱 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} # 指定當發生Rolling時,文件的轉移和重命名規則 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 # 基于時間的觸發策略 appender.rolling.policies.time.type=TimeBasedTriggeringPolicy # 當前記錄周期為每1h生成一個文件 appender.rolling.policies.time.interval=1 appender.rolling.policies.time.modulate=true # 基于日志文件體積的觸發策略 appender.rolling.policies.size.type=SizeBasedTriggeringPolicy # 當日志文件體積大于size指定的值時,觸發Rolling appender.rolling.policies.size.size=20M # 文件封存的覆蓋策略 appender.rolling.strategy.type=DefaultRolloverStrategy # 生成分割(封存)文件的個數 appender.rolling.strategy.max=100
打印效果
打印時,對不同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}
原工作組比較清閑,被臨時借調到新的工作組。組長給了個任務是把Log4j的XML配置文件改成properties,原因是XML格式的看著不舒服。哈,以上不算吐槽,只是交待一下,為什么我要這么費勁的使用properties做配置文件。
Log4j2 一開始拋棄了properties配置文件格式,到2.4版本時,又開始支持properties配置文件格式。到2.6版本又有新的要求。我用的是寫本文時的最近版本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
以上是“基于log4j2.properties踩坑與填坑的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。