真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringBoot中怎么使用logback記錄多個文件日志

這期內(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è)資訊頻道。


當前標題:SpringBoot中怎么使用logback記錄多個文件日志
文章URL:http://weahome.cn/article/ieioos.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部