這期內(nèi)容當中小編將會給大家?guī)碛嘘PSpring Boot中怎么使用logback 記錄多個文件日志,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
成都創(chuàng)新互聯(lián)公司主營金沙網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,重慶APP開發(fā)公司,金沙h5小程序定制開發(fā)搭建,金沙網(wǎng)站營銷推廣歡迎金沙等地區(qū)企業(yè)咨詢
第一次實現(xiàn)
我有好幾個服務需要打日志. 一般來講我的日志風格是 *.log 保存 INFO以上級別日志. *.err.log保存ERROR以上級別日志. 我如果每個文件日志都使用一個Appender的話, 配置文件太長了. 而且很難看, 不是我的風格.
Google了一下, 發(fā)現(xiàn)了這種方案:
# 下面這一行的意思是使用application.yml中的global.log-dir變量 # 這個是一個可以定義變量的Appender # 使用 LoggerNameBasedDiscriminator 這個類根據(jù)當前Logger獲取變量 general # 根據(jù)變量loggerName名字生成根據(jù)日期滾動的Appender ${LOG_DIR}/${loggerName}.log ${LOG_DIR}/${loggerName}.%d{yyyy-MM-dd}.log.gz 15 INFO %d{HH:mm:ss.SSS} %-5level - %msg%n ${LOG_DIR}/${loggerName}.err.log ${LOG_DIR}/${loggerName}.%d{yyyy-MM-dd}.err.log.gz 15 ERROR %d{HH:mm:ss.SSS} %-5level - %msg%n
下的是對應的 LoggerNameBasedDiscriminator 類
package com.utils.loggers; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.sift.AbstractDiscriminator; public class LoggerNameBasedDiscriminator extends AbstractDiscriminator{ private static final String KEY = "loggerName"; private String defaultValue; public String getDefaultValue() { return defaultValue; } public void setDefaultValue(String defaultValue) { this.defaultValue = defaultValue; } # 這就是之所以xml里面可以引用loggerName變量的原因 public String getKey() { return KEY; } public void setKey() { throw new UnsupportedOperationException("Key not settable. Using " + KEY); } public String getDiscriminatingValue(ILoggingEvent e) { String loggerName = e.getLoggerName(); if (loggerName == null) return defaultValue; else { String[] split = loggerName.split("\\."); return split[split.length - 1]; } } }
最開始我的日志里面沒有報錯信息, 正常的生成INFO日志. 但是后來發(fā)現(xiàn)事情好像不是想象的那樣
問題出現(xiàn)
后來我把程序改成多線程. 發(fā)現(xiàn)所有涉及到多線程的服務日志里面都沒信息了. Google半天, 發(fā)現(xiàn)幾個令我震驚的真相:
真相1: 所有滾動Appender都不支持異步追加 (其實也不是, 但是那種方式需要寫死日志文件名, 不推薦, 不講)
真相2: SiftingAppender 內(nèi)部最多嵌套一個Appender. 所以理論上我的ERROR的日志里面應該永遠不會有內(nèi)容.
問題解決
對于之前的兩個問題, 分而治之.
不支持異步
再次谷歌(到這里讀者基本上發(fā)現(xiàn)了我搬磚的本質(zhì)), 發(fā)現(xiàn)有個Appender名字叫AsyncAppender, 這玩意是一個其他Appender的Wrapper. 說白了, 就是你打日志的命令是異步的, 放到隊列里面, 而它真正的打日志的動作是一個單獨的同步線程. 這就牛逼了, 使用這玩意收集我所有日志, 然后再轉(zhuǎn)發(fā)給SiftingAppender 進行分發(fā)即可.
SiftingAppender 內(nèi)部最多嵌套一個Appender
這個好辦, 把INFO的Appender和ERROR的Appender拆開放到兩個SiftingAppender里面就行了, 不過這樣的話, 前面提到的的AsyncAppender 也要寫兩個.
最后, logback-spring.xml文件如下
${LOG_DIR}/${loggerName}.log ${LOG_DIR}/${loggerName}.%d{yyyy-MM-dd}.log 15 INFO %d{HH:mm:ss.SSS} %-5level - %msg%n ${LOG_DIR}/${loggerName}.err.log ${LOG_DIR}/${loggerName}.%d{yyyy-MM-dd}.err.log 15 50MB ERROR %d{HH:mm:ss.SSS} %-5level - %msg%n 0 512 0 512
上述就是小編為大家分享的Spring Boot中怎么使用logback 記錄多個文件日志了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。