記錄-分模塊輸出到不同的日誌文件

今天碰到一個業務場景:

之前做好了一個web系統,接到任務需要將一個獨立的Java系統嵌入到web系統中,Java系統嵌入順利完成,此時出現了一個問題由於Java和web兩個系統都使用了日誌系統,造成此前的web系統中日誌文件全部定向到嵌入後的Java系統日誌輸出文件內。

原因剖析

web中日誌配置文件(log4j.properties)

log4j.rootLogger=info,A1,R
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.Target=System.out
log4j.appender.common.DatePattern = '.'yyyy-MM-dd
log4j.appender.common.Threshold = INFO
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%p] [%c:%L] %m%n

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=../logs/xxx
log4j.appender.R.DatePattern ='-'yyyy-MM-dd'.log'
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.Append = true
log4j.appender.R.ImmediateFlush = true
log4j.appender.R.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%p] [%c:%L] %m%n

Java中日誌配置文件(log4j.properties)

log4j.rootLogger=info,stdout,R
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=../logs/xxx
log4j.appender.R.DatePattern ='-'yyyy-MM-dd'.log'
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.Append = true
log4j.appender.R.ImmediateFlush = true
log4j.appender.R.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%p] [%c:%L] %m%n

由於都配置了log R對象因此會被覆蓋指向爲後者的文件中

解決1

### 根設置###
log4j.rootLogger = info,stdout,D,E

### 輸出信息到控制擡 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 輸出DEBUG 級別以上的日誌
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /Users/mac/Documents/Java_log/InfoLog.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = info
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 輸出ERROR 級別以上的日誌
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =/Users/mac/Documents/Java_log/ErrorLog.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n


###新增其他日誌文件
#新增log對象'collectLogger'
log4j.logger.collectLogger=info,DefaultCollectLog
#每天生成日誌文件類'DailyRollingFileAppender'
log4j.appender.DefaultCollectLog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.DefaultCollectLog.File =/Users/mac/Documents/Java_log/default_collect.log
log4j.appender.DefaultCollectLog.Append = true
log4j.appender.DefaultCollectLog.layout = org.apache.log4j.PatternLayout
log4j.appender.DefaultCollectLog.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

其中新增其他日誌文件下擴充了log4j collectLogger對象,並且設置了該日誌對象的等級爲info

測試


測試項目目錄結構

假定log1,log2,log3爲之前的web系統中類。而collect1,ollect2,ollect3爲新增的Java系統中得類。

/**
 * TODO:<p> log1類,其他的兩個log2和log3內容一致 <p/>
 *
 * @package: log1
 * @Author mac
 * @Date 2020/4/15 8:14 下午
 * @Version V1.0
 **/
public class log1 {
    private static final Logger logger = Logger.getLogger(log1.class);
    public void run(){
        logger.info("log1 >  >  >  >信息");
        logger.info("log1 >  >  >  >信息");
        logger.info("log1 >  >  >  >信息");
        logger.info("log1 >  >  >  >信息");
        logger.info("log1 >  >  >  >信息");
        logger.info("log1 >  >  >  >信息");
        logger.info("log1 >  >  >  >信息");
    }
}
/**
 * TODO:<p> collect1,其餘collect2和collect3內容一致 <p/>
 *
 * @package: log1
 * @Author mac
 * @Date 2020/4/15 8:31 下午
 * @Version V1.0
 **/
public class collect1 {
    // 注意,這裏是剛剛定義的log4j 對象 ‘collectLogger’
    private static final Logger logger = Logger.getLogger("collectLogger");
    public void run(){
        logger.info("collect1 >  >  >  >信息");
        logger.info("collect1 >  >  >  >信息");
        logger.info("collect1 >  >  >  >信息");
        logger.info("collect1 >  >  >  >信息");
        logger.info("collect1 >  >  >  >信息");
        logger.info("collect1 >  >  >  >信息");
        logger.info("collect1 >  >  >  >信息");
    }
}

java系統類中的日誌輸出爲 ‘default_collect.log’

2020-04-15 20:53:57 [ main:9 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:14 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:14 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:14 ] - [ INFO ] collect3 > > > >信息

web系統類中的日誌輸出爲 ‘infoLog.log’

2020-04-15 20:53:57 [ main:0 ] - [ INFO ] log1 > > > >信息
2020-04-15 20:53:57 [ main:2 ] - [ INFO ] log1 > > > >信息
2020-04-15 20:53:57 [ main:2 ] - [ INFO ] log1 > > > >信息
2020-04-15 20:53:57 [ main:3 ] - [ INFO ] log1 > > > >信息
2020-04-15 20:53:57 [ main:3 ] - [ INFO ] log1 > > > >信息
2020-04-15 20:53:57 [ main:3 ] - [ INFO ] log1 > > > >信息
2020-04-15 20:53:57 [ main:5 ] - [ INFO ] log1 > > > >信息
2020-04-15 20:53:57 [ main:5 ] - [ INFO ] log2 > > > >信息
2020-04-15 20:53:57 [ main:5 ] - [ INFO ] log2 > > > >信息
2020-04-15 20:53:57 [ main:5 ] - [ INFO ] log2 > > > >信息
2020-04-15 20:53:57 [ main:6 ] - [ INFO ] log2 > > > >信息
2020-04-15 20:53:57 [ main:6 ] - [ INFO ] log2 > > > >信息
2020-04-15 20:53:57 [ main:6 ] - [ INFO ] log2 > > > >信息
2020-04-15 20:53:57 [ main:6 ] - [ INFO ] log2 > > > >信息
2020-04-15 20:53:57 [ main:6 ] - [ INFO ] log3 > > > >信息
2020-04-15 20:53:57 [ main:7 ] - [ INFO ] log3 > > > >信息
2020-04-15 20:53:57 [ main:8 ] - [ INFO ] log3 > > > >信息
2020-04-15 20:53:57 [ main:9 ] - [ INFO ] log3 > > > >信息
2020-04-15 20:53:57 [ main:9 ] - [ INFO ] log3 > > > >信息
2020-04-15 20:53:57 [ main:9 ] - [ INFO ] log3 > > > >信息
2020-04-15 20:53:57 [ main:9 ] - [ INFO ] log3 > > > >信息
2020-04-15 20:53:57 [ main:9 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:10 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect1 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:11 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:12 ] - [ INFO ] collect2 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:13 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:14 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:14 ] - [ INFO ] collect3 > > > >信息
2020-04-15 20:53:57 [ main:14 ] - [ INFO ] collect3 > > > >信息

問題:該方案中web系統日誌文件包含了java系統的輸出日誌,如並且java系統日誌文件時獨立的,如果你想要這種效果那麼可以使用該方案

原因是:由於log4j.rootLogger = info,stdout,D,E中‘rootLogger’爲根對象,所有的日誌對象都繼承於該對象,因此新增的log4j collectLogger對象也屬於根對象的子類,並且子類中輸出的內容也要輸出到根對象配置的日誌文件中。

解決二

## Global logging configuration 開發時候建議使用 debug
#log4j.rootLogger=DEBUG, stdout
## Console output...
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
##log4j.appender.A1.File=/Volumes/mac資料/IdeaWorkSpace/maven-Java/src/main/java/thread_lean/threadSafety/logFile.log
#log4j.appender.A1.File=../logs/logFile.log

### 根設置###
log4j.rootLogger = info,stdout,D,E

### 輸出信息到控制擡 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 輸出DEBUG 級別以上的日誌
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /Users/mac/Documents/Java_log/InfoLog.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = info
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 輸出ERROR 級別以上的日誌
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =/Users/mac/Documents/Java_log/ErrorLog.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n



###新增其他日誌文件:即系統中分模塊來進行日誌控制,不同的模塊設定不一樣的日誌文件
#新增log對象'collectLogger'
log4j.logger.collectLogger=info,DefaultCollectLog
#每天生成日誌文件類'DailyRollingFileAppender'
log4j.appender.DefaultCollectLog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.DefaultCollectLog.File =/Users/mac/Documents/Java_log/default_collect.log
log4j.appender.DefaultCollectLog.Append = true
log4j.appender.DefaultCollectLog.layout = org.apache.log4j.PatternLayout
log4j.appender.DefaultCollectLog.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n


###新增log對象'com.logtest'
#com.logtest 是包名,這個包裏面的log日誌會打到下面配置的路徑下,且這個包裏的日誌文件不會再打到上面配置的總的log日誌路徑裏
log4j.logger.com.logtest=info, service
log4j.additivity.com.logtest=false
log4j.appender.service=org.apache.log4j.DailyRollingFileAppender
log4j.appender.service.File=/Users/mac/Documents/Java_log/server.log
log4j.appender.service.Append=true
log4j.appender.service.layout=org.apache.log4j.PatternLayout
log4j.appender.service.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.service.encoding=UTF-8

其中新增log對象'com.logtest'下擴充了log4j com.logtest對象,並且設置了該日誌對象的等級爲info

測試

/**
 * TODO:<p> 在此前測試類基礎上新增test1用以測試 com.logtest對象<p/>
 *
 * @package: com.logtest
 * @Author mac
 * @Date 2020/4/15 8:43 下午
 * @Version V1.0
 **/
public class test1 {
    private static final Logger logger = Logger.getLogger(test1.class);
    public void run(){
        logger.info("test1 >  >  >  >信息");
        logger.info("test1 >  >  >  >信息");
        logger.info("test1 >  >  >  >信息");
        logger.info("test1 >  >  >  >信息");
        logger.info("test1 >  >  >  >信息");
        logger.info("test1 >  >  >  >信息");
        logger.info("test1 >  >  >  >信息");

    }
}

server.log

2020-04-15 20:53:57 [INFO ][test1] [main] - test1 > > > >信息
2020-04-15 20:53:57 [INFO ][test1] [main] - test1 > > > >信息
2020-04-15 20:53:57 [INFO ][test1] [main] - test1 > > > >信息
2020-04-15 20:53:57 [INFO ][test1] [main] - test1 > > > >信息
2020-04-15 20:53:57 [INFO ][test1] [main] - test1 > > > >信息
2020-04-15 20:53:57 [INFO ][test1] [main] - test1 > > > >信息
2020-04-15 20:53:57 [INFO ][test1] [main] - test1 > > > >信息

注意點

  1. 該方案中web系統中的InfoLog.log文件中並不會包含server.log中的內容

  2. 該方案適用於遷移有日誌系統的程序時使用,因爲該方案中com.logtest日誌對象對應的就是包名,因此你只需要設置該方案中com.logtest對象爲你遷移的項目包名即可全部修改該包下所有的日誌輸出配置。

  3. 該方案中com.logtest對象由於使用了‘log4j.additivity.com.logtest=false’會導致控制檯中不會輸出該包下所有的日誌輸出內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章