log4j中的DailyRollingFileAppender日志輸出器工作原理


新年之際,碰到線上日志文件消失問題,借此機會解讀了一下log4j日志的工作原理,以此記錄一下

首先項目中的log4j.properties配置內容

log4j.rootLogger=info,logfile
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %l %-5p - %m%n
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=/opt/appstack/apache-tomcat/logs/XX/XX.log
log4j.appender.logfile.maxBackupIndex=30
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern====%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n

DailyRollingFileAppender依賴關系

 

log4j日志工作原理

一、讀取初始化日志配置信息

private final Logger log = LoggerFactory.getLogger(this.getClass());

log對象獲取工作原理

org.slf4j.LoggerFactory#getLogger(java.lang.String)

  org.slf4j.impl.Log4jLoggerFactory#getLogger

  

  所以這里的log對象是Log4jLoggerAdapter類型

  

  LogManager的靜態有對log4j.properties讀取解析

 

 二、代碼日志記錄工作原理

打印記錄

log.info("開始時間:{},訪問路徑:/api/user/login,手機號:{},fv:{},fsv:{},登錄參數信息:{}", start, loginDTO.getPhone(),
loginDTO.getFv(), loginDTO.getFsv(), JSON.toJSONString(loginDTO));

 所有的日志級別記錄,最終都是進入到以下方法

org.apache.log4j.Category#log(java.lang.String, org.apache.log4j.Priority, java.lang.Object, java.lang.Throwable)

 

整個日志記錄執行方法調用過程:

org.slf4j.impl.Log4jLoggerAdapter#info(java.lang.String, java.lang.Object...)

org.apache.log4j.Category#log(java.lang.String, org.apache.log4j.Priority, java.lang.Object, java.lang.Throwable)

org.apache.log4j.Category#forcedLog(java.lang.String, org.apache.log4j.Priority, java.lang.Object, java.lang.Throwable)

org.apache.log4j.Category#callAppenders(org.apache.log4j.spi.LoggingEvent)

org.apache.log4j.helpers.AppenderAttachableImpl#appendLoopOnAppenders(org.apache.log4j.spi.LoggingEvent)

org.apache.log4j.AppenderSkeleton#doAppend(org.apache.log4j.spi.LoggingEvent)

org.apache.log4j.WriterAppender#append(org.apache.log4j.spi.LoggingEvent)

org.apache.log4j.DailyRollingFileAppender#subAppend(org.apache.log4j.spi.LoggingEvent)

org.apache.log4j.WriterAppender#subAppend(org.apache.log4j.spi.LoggingEvent)

org.apache.log4j.helpers.QuietWriter#write(java.lang.String)

 

其中org.apache.log4j.DailyRollingFileAppender#subAppend(org.apache.log4j.spi.LoggingEvent)方法代碼邏輯

protected void subAppend( LoggingEvent event ){

  long n = System.currentTimeMillis();
  if ( n >= nextCheck )
  {
    now.setTime( n );
    nextCheck = rc.getNextCheckMillis( now );
    try {
      rollOver();
    }catch ( IOException ioe ) {
      if ( ioe instanceof InterruptedIOException ){
        Thread.currentThread().interrupt();
      }
      LogLog.error( "rollOver() failed.", ioe );
    }
  }
  super.subAppend( event );
}

如果是當前時間到了下次生成新的日志文件時間時,執行rollOver方法,該方法包含對之前歸檔的日志文件處理以及生成新的日志文件

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM