web項目日誌記錄方案

1、概述html

 

一、採用slf4j做爲日誌API,採用logback做爲日誌輸出工具,用slf4j橋接方式替換掉log4j和commons-logging。java

二、採用trace(追蹤)、debug(調試)、info(信息)、warn(警告)、error(錯誤)、fatal(致命)共6種日誌級別。linux

三、採用dev(開發環境)、test(測試環境)、production(生產環境)等不一樣的日誌配置,根據環境變量自動識別。web

四、特殊的記錄,須要大批量寫入日誌文件,應該採用異步線程寫文件。apache

 

2、日誌級別定義tomcat

    採用trace(追蹤)、debug(調試)、info(信息)、warn(警告)、error(錯誤)、fatal(致命)共6種日誌級別。服務器

    log4j建議使用4種級別 :優先級 從高到低分別是 ERROR、WARN、INFO、DEBUG;若是添加了日誌開關,那麼會優先展現優先級別高的;app

    如 : 在這裏定義了INFO級別, 則應用程序中全部DEBUG級別的日誌信息將不被打印出來。eclipse

 

日誌級別使用原則:異步

一、fatal(致命錯誤)使用原則

fatal爲系統級別的異常,發生fatal錯誤,表明服務器整個或者核心功能已經沒法工做了!!

1)在服務器啓動時就應該檢查,若是存在致命錯誤,直接拋異常,讓服務器不要啓動起來(啓動了也沒法正常工做,不如不啓動)。

2)若是在服務器啓動以後,發生了致命的錯誤,則記錄fatal級別的錯誤日誌,最好是同時觸發相關的修復和告警工做(好比,給開發和維護人員發送告警郵件)。

 

二、error(錯誤)使用原則

error爲功能或者邏輯級別的嚴重異常,發生error級別的異常,表明功能或者重要邏輯遇到問題、沒法正常工做。

 

三、warn(警告)使用原則

warn用在某些邏輯很是規,發生了一些小故障可是沒有大的影響,或者重要數據被修改,或者某些操做須要引發重視。

 

四、info(信息)使用原則

info用於記錄一些有用的、關鍵的信息,通常這些信息出現得不頻繁,只是在初始化的地方或者重要操做的地方纔記錄。

 

五、debug(調試)使用原則

debug用於記錄一些調試信息,爲了方便查看程序的執行過程和相關數據、瞭解程序的動態。

 

六、trace(跟蹤)使用原則

trace用於記錄一些更詳細的調試信息,這些信息無需每次調試時都打印出來,只在須要更詳細的調試信息時纔開啓。

 

七、項目穩定運行時的日誌量

1)正常狀況下,trace日誌至少是debug日誌的100倍,

trace級別的日誌量 : debug級別的日誌量  >  100 : 1,

也就是說trace日誌很是多,debug日誌相對較少。

 

2)debug級別的日誌量 : info級別的日誌量 > 1000 : 1,

也就是說正常狀況下,info日誌不多,只在部分重要位置會輸出 info日誌。

 

3)error日誌和warn日誌,正常狀況下,幾乎爲0,當出現異常時,error日誌和warn日誌量 也在可控範圍,不會超過debug級別的最大日誌量。

 

3、日誌輸出(Appender)分類

 

分爲5個通常類: 

    FILE_EXCEPTION (異常日誌,包括ERROR和WARN)

    FILE_APP (應用日誌,包括當前應用package下面的日誌和DEBUG級別以上的其餘日誌)

    FILE_INFO (普通訊息日誌)

    FILE_DEBUG (調試日誌)

    FILE_TRACE(追蹤日誌)

    SYSOUT(控制檯輸出,能夠包括以上全部日誌)

擴展類: 包括異步輸出的日誌,或者特殊業務日誌。

 

舉例說明:

假如 

當前應用的 Main Package 爲 cn.zollty.lightning

ROOT_LEVEL爲 trace,應用日誌 LEVEL 爲 debug

有如下日誌打印:

1
2
3
4
5
6
7
8
9
10
11
12
13
Logger loggerA = LoggerFactory.getLogger(cn.zollty.lightning.Tests. class );
loggerA.trace( "--------" );
loggerA.debug( "--------" );
loggerA.info( "--------" );
loggerA.warn( "--------" );
loggerA.error( "--------" );
 
Logger loggerB = LoggerFactory.getLogger(org.apache.kafka.Consumer. class );
loggerB.trace( "--------" );
loggerB.debug( "--------" );
loggerB.info( "--------" );
loggerB.warn( "--------" );
loggerB.error( "--------" );

那麼,異常日誌(FILE_EXCEPTION)輸出的爲:

loggerA.warn("--------");

loggerA.error("--------");

loggerB.warn("--------");

loggerB.error("--------");

控制檯(SYSOUT)輸出日誌的爲;

loggerA.debug("--------");

loggerA.info("--------");

loggerA.warn("--------");

loggerA.error("--------");

loggerB.trace("--------");

loggerB.debug("--------");

loggerB.info("--------");

loggerB.warn("--------");

loggerB.error("--------");

應用日誌(FILE_APP)輸出的爲:

loggerA.debug("--------");

loggerA.info("--------");

loggerA.warn("--------");

loggerA.error("--------");

loggerB.info("--------");

loggerB.warn("--------");

loggerB.error("--------");

 

二、歷史日誌文件

異常日誌(error和warn)最多保存 9000 M(生產,測試)

app日誌最多保存 9000 M (生產,測試)

trace日誌最多保存 1000 M (僅供測試用,通常不用)

debug、info日誌最多保存 5000 M(通常不用,用app日誌就夠了)

 

4、各環境默認日誌定義

 

開發環境

1)默認日誌級別定義爲:

    app包爲TRACE級別。日誌的ROOT Level爲DEBUG級別。

2)

啓用 System.out 控制檯輸出日誌;

啓用error.log爲錯誤和警告日誌、app.log爲應用日誌(包括app包下的日誌和其餘INFO級別以上的日誌)。

 

測試環境

1)默認日誌級別定義爲:

    app包爲DEBUG級別。日誌的ROOT Level爲DEBUG級別。

2)

禁用 System.out 控制檯輸出日誌;

啓用error.log爲錯誤和警告日誌、app.log爲應用日誌(包括app包下的日誌和其餘INFO級別以上的日誌)。

 

生產環境

1)默認日誌級別定義爲:

    app包爲DEBUG級別。日誌的ROOT Level爲INFO級別。

2)

禁用 System.out 控制檯輸出日誌;

啓用error.log爲錯誤和警告日誌、app.log爲應用日誌(包括app包下的日誌和其餘INFO級別以上的日誌)。

 

5、根據環境自動選擇日誌配置(藉助Logback)

 

關鍵點1:使用logback的環境變量定義和讀取功能

例以下面的各類環境變量定義:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- 部署的環境類型:dev、test、product -->
< property  name = "DEPLOY_ENV"  value = "${deploy.env:-dev}"  />
 
<!-- 日誌路徑,這裏是相對路徑,web項目eclipse下會輸出到當前目錄./logs/下,若是部署到linux上的tomcat下,會輸出到tomcat/logs/目錄 下 -->
< property  name = "LOG_HOME"  value = "${catalina.base:-.}/logs"  />
 
<!-- 日誌文件大小,超過這個大小將被壓縮 -->
< property  name = "LOG_MAX_SIZE"  value = "100MB"  />
<!-- 日誌輸出格式 -->
< property  name = "LOG_COMMON_PATTERN"  value = "%d{HH:mm:ss.SSS} [%thread] [%level] %logger - %msg%n"  />
< property  name = "LOG_DEV_PATTERN"  value = "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{48}:%line - %msg%n"  />
 
<!-- 主日誌級別 -->
< property  name = "ROOT_LEVEL"  value = "${log.root.level:-DEBUG}"  />
 
<!-- APP 日誌級別 -->
< property  name = "APP_LEVEL"  value = "${log.app.level:-TRACE}"  />
<!-- APP Package 前綴: cn.zollty.lightning -->
< property  name = "APP_PACKAGE"  value = "cn.zollty.lightning"  />

其中 ${deploy.env:-dev} 表明的意思是,若是環境變量中沒有 deploy.env,則使用默認值dev。

 

一個小技巧:能夠自定義相似下面這個類,在logback初始化以前,先設置變量的值:

1
< statusListener  class = "cn.zollty.commons.logbackext.InitConfigOnConsoleStatusListener"  />

這個類繼承自ch.qos.logback.core.status.OnConsoleStatusListener。

 

關鍵點2:使用logback的 if-then 條件語法

1
2
3
4
5
6
7
8
9
10
11
12
< root  level = "${ROOT_LEVEL}" >
   <!-- Required: exception log -->
   < appender-ref  ref = "FILE_EXCEPTION" />
   <!-- Required: app log  -->
   < appender-ref  ref = "FILE_APP" />
 
   < if  condition = 'p("DEPLOY_ENV").contains("dev")' >
     < then >
     < appender-ref  ref = "STDOUT"  />
     </ then >
   </ if >
</ root >

 

參考配置:

logback.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<? xml  version = "1.0"  encoding = "UTF-8" ?>
< configuration  scan = "true"  scanPeriod = "60 seconds"  debug = "false" >
 
   < statusListener  class = "cn.zollty.commons.logbackext.InitConfigOnConsoleStatusListener"  />
 
   <!-- 部署的環境類型:dev、test、product -->
   < property  name = "DEPLOY_ENV"  value = "${deploy.env:-dev}"  />
 
   <!-- 日誌路徑,這裏是相對路徑,web項目eclipse下會輸出到當前目錄./logs/下,若是部署到linux上的tomcat下,會輸出到tomcat/logs/目錄 下 -->
   < property  name = "LOG_HOME"  value = "${catalina.base:-.}/logs"  />
   
   <!-- 日誌文件大小,超過這個大小將被壓縮 -->
   < property  name = "LOG_MAX_SIZE"  value = "100MB"  />
   <!-- 日誌輸出格式 -->
   < property  name = "LOG_COMMON_PATTERN"  value = "%d{HH:mm:ss.SSS} [%thread] [%level] %logger - %msg%n"  />
   < property  name = "LOG_DEV_PATTERN"  value = "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{48}:%line - %msg%n"  />
 
   <!-- 主日誌級別 -->
   < property  name = "ROOT_LEVEL"  value = "${log.root.level:-DEBUG}"  />
 
   <!-- APP 日誌級別 -->
   < property  name = "APP_LEVEL"  value = "${log.app.level:-TRACE}"  />
   <!-- APP Package 前綴: cn.cstonline.zollty -->
   < property  name = "APP_PACKAGE"  value = "cn.zollty.lightning"  />
   
   < include  resource = "includedConfig.xml" />
   
   < appender  name = "STDOUT"  class = "ch.qos.logback.core.ConsoleAppender" >
     < encoder >
       < pattern >${LOG_DEV_PATTERN}</ pattern >
     </ encoder >
   </ appender >
   
   < appender  name = "FILTER-DATA"  class = "ch.qos.logback.core.rolling.RollingFileAppender" >
     < file >${LOG_HOME}/filter.log</ file >
     < rollingPolicy  class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" >
       < fileNamePattern >${LOG_HOME}/filter/filter-%d{yyyy-MM-dd}-%i.log.zip</ fileNamePattern >
       < maxHistory >90</ maxHistory >
       < TimeBasedFileNamingAndTriggeringPolicy  class = "ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP" >
         < MaxFileSize >100MB</ MaxFileSize >
       </ TimeBasedFileNamingAndTriggeringPolicy >
     </ rollingPolicy >
     < encoder >
       < pattern >${LOG_COMMON_PATTERN}</ pattern >
     </ encoder >
   </ appender >
   
   < appender  name = "ASYNC1"  class = "ch.qos.logback.classic.AsyncAppender" >
     < appender-ref  ref = "FILTER-DATA"  />
   </ appender >
   
   < include  resource = "special_log_level.xml" />
 
   < logger  name = "${APP_PACKAGE}"  level = "${APP_LEVEL}"  />
   
   < logger  name = "FILTER-LOGGER"  level = "${APP_LEVEL}"  additivity = "false" >
     < appender-ref  ref = "ASYNC1"  />
   </ logger >
 
   < root  level = "${ROOT_LEVEL}" >
     <!-- Required: exception log -->
     < appender-ref  ref = "FILE_EXCEPTION" />
     <!-- Required: app log  -->
     < appender-ref  ref = "FILE_APP" />
     
     <!-- Optional: show all debug or trace info -->
     <!-- <appender-ref ref="FILE_DEBUG"/> -->
     <!-- <appender-ref ref="FILE_TRACE"/> -->
     
     < if  condition = 'p("DEPLOY_ENV").contains("dev")' >
       < then >
         < appender-ref  ref = "STDOUT"  />
       </ then >
     </ if >
     
   </ root >
 
</ configuration >

includedConfig.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<? xml  version = "1.0"  encoding = "UTF-8"  ?>
 
< included >
 
   <!-- WARN and ERROR -->
   < appender  name = "FILE_EXCEPTION"  class = "ch.qos.logback.core.rolling.RollingFileAppender" >
     < filter  class = "ch.qos.logback.classic.filter.ThresholdFilter" >
       < level >WARN</ level >
     </ filter >
     < file >${LOG_HOME}/error.log</ file >
     < rollingPolicy  class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" >
       <!-- rollover daily -->
       < fileNamePattern >${LOG_HOME}/error/error-%d{yyyy-MM-dd}-%i.log.zip</ fileNamePattern >
       < maxHistory >90</ maxHistory >
       < TimeBasedFileNamingAndTriggeringPolicy  class = "ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP" >
         <!-- or whenever the file size reaches 100MB -->
         < MaxFileSize >${LOG_MAX_SIZE}</ MaxFileSize >
       </ TimeBasedFileNamingAndTriggeringPolicy >
     </ rollingPolicy >
     < encoder >
       < pattern >${LOG_COMMON_PATTERN}</ pattern >
     </ encoder >
   </ appender >
 
   <!-- INFO or Greater -->
   < appender  name = "FILE_INFO"  class = "ch.qos.logback.core.rolling.RollingFileAppender" >
     < filter  class = "ch.qos.logback.classic.filter.ThresholdFilter" >
       < level >INFO</ level >
     </ filter >
     < file >${LOG_HOME}/info.log</ file >
     < rollingPolicy  class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" >
       < fileNamePattern >${LOG_HOME}/info/info-%d{yyyy-MM-dd}-%i.log.zip</ fileNamePattern >
       < maxHistory >50</ maxHistory >
       < TimeBasedFileNamingAndTriggeringPolicy  class = "ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP" >
         < MaxFileSize >${LOG_MAX_SIZE}</ MaxFileSize >
       </ TimeBasedFileNamingAndTriggeringPolicy >
     </ rollingPolicy >
     < encoder >
       < pattern >${LOG_COMMON_PATTERN}</ pattern >
     </ encoder >
   </ appender >
 
   <!-- DEBUG or Greater-->
   < appender  name = "FILE_DEBUG"  class = "ch.qos.logback.core.rolling.RollingFileAppender" >
     < filter  class = "ch.qos.logback.classic.filter.ThresholdFilter" >
       < level >DEBUG</ level >
     </ filter >
     < file >${LOG_HOME}/debug.log</ file >
     < rollingPolicy  class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" >
       < fileNamePattern >${LOG_HOME}/debug/debug-%d{yyyy-MM-dd}-%i.log.zip</ fileNamePattern >
       < maxHistory >50</ maxHistory >
       < TimeBasedFileNamingAndTriggeringPolicy  class = "ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP" >
         < MaxFileSize >${LOG_MAX_SIZE}</ MaxFileSize >
       </ TimeBasedFileNamingAndTriggeringPolicy >
     </ rollingPolicy >
     < encoder >
       < pattern >${LOG_COMMON_PATTERN}</ pattern >
     </ encoder >
   </ appender >
 
   <!-- TRACE and ALL -->
   < appender  name = "FILE_TRACE"  class = "ch.qos.logback.core.rolling.RollingFileAppender" >
     < file >${LOG_HOME}/trace.log</ file >
     < rollingPolicy  class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" >
       < fileNamePattern >${LOG_HOME}/trace/trace-%d{yyyy-MM-dd}-%i.log.zip</ fileNamePattern >
       < maxHistory >10</ maxHistory >
       < TimeBasedFileNamingAndTriggeringPolicy  class = "ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP" >
         < MaxFileSize >${LOG_MAX_SIZE}</ MaxFileSize >
       </ TimeBasedFileNamingAndTriggeringPolicy >
     </ rollingPolicy >
     < encoder >
       < pattern >${LOG_COMMON_PATTERN}</ pattern >
     </ encoder >
   </ appender >
   
   <!-- (INFO or Greater) or logname prefix = ${APP_PACKAGE} -->
   < appender  name = "FILE_APP"  class = "ch.qos.logback.core.rolling.RollingFileAppender" >
     < filter  class = "cn.zollty.lightning.common.PackageOrThresholdFilter" >
       < level >INFO</ level >
       < prefix >${APP_PACKAGE}</ prefix >
     </ filter >
     < file >${LOG_HOME}/app.log</ file >
     < rollingPolicy  class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" >
       < fileNamePattern >${LOG_HOME}/app/app-%d{yyyy-MM-dd}-%i.log.zip</ fileNamePattern >
       < maxHistory >90</ maxHistory >
       < TimeBasedFileNamingAndTriggeringPolicy  class = "ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP" >
         < MaxFileSize >${LOG_MAX_SIZE}</ MaxFileSize >
       </ TimeBasedFileNamingAndTriggeringPolicy >
     </ rollingPolicy >
     < encoder >
       < pattern >${LOG_COMMON_PATTERN}</ pattern >
     </ encoder >
   </ appender >
 
</ included >

special_log_level.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<? xml  version = "1.0"  encoding = "UTF-8"  ?>
< included >
 
   < logger  name = "org.apache.zookeeper.ClientCnxn"  level = "ERROR"  />
   < logger  name = "org.apache.kafka.clients.consumer.internals.ConsumerCoordinator"  level = "INFO"  />
   < logger  name = "kafka.producer.BrokerPartitionInfo"  level = "INFO"  />
   < logger  name = "kafka.producer.async.ProducerSendThread"  level = "INFO"  />
   < logger  name = "kafka.producer.async.DefaultEventHandler"  level = "INFO"  />
   < logger  name = "org.apache.kafka.common.metrics.Metrics"  level = "INFO"  />
   < logger  name = "org.apache.kafka.clients.Metadata"  level = "INFO"  />
   
   < logger  name = "org.apache.kafka.clients.consumer.internals.AbstractCoordinator"  level = "INFO"  />
   < logger  name = "org.apache.kafka.clients.consumer.internals.Fetcher"  level = "INFO"  />
   < logger  name = "org.apache.kafka.clients.NetworkClient"  level = "INFO"  />
   
</ included >

 

也能夠把變量定義到properties文件中,本地就放在 

src/resources/conf/logback_val.properties

服務器上放在

${catalina.base}/conf/logback_val.properties

配置以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<? xml  version = "1.0"  encoding = "UTF-8" ?>
< configuration  scan = "true"  scanPeriod = "60 seconds"  debug = "false" >
 
   < if  condition = 'isDefined("catalina.base")' >
     < then >
       < property  file = "${catalina.base}/conf/logback_val.properties"  />
     </ then >
     < else >
       < property  resource = "./conf/logback_val.properties"  />
     </ else >
   </ if >
   
   ...

logback_val.properties:

1
2
3
4
5
6
7
8
9
10
# \u90E8\u7F72\u7684\u73AF\u5883\u7C7B\u578B\uFF1Adev\u3001test\u3001product
deploy.env=dev
# \u4E3B\u65E5\u5FD7\u7EA7\u522B
log.root.level=DEBUG
# APP \u65E5\u5FD7\u7EA7\u522B
log.app.level=TRACE
# Kafka LogStash \u9009\u62E9\u4F7F\u7528 value= "yes" or "no"
log.use.logstash=yes
# LogStash Kafka URL
log.logstash.kafka=172.16.1.164:9092,172.16.1.165:9092,172.16.1.166:9092

log4j中進行過濾的方法 :

log4j中log.isDebugEnabled(), log.isInfoEnabled()和log.isTraceEnabled()做用 :
  一、項目在應用log4j打印Debug,Info和Trace級別的log時須要加上對應的三個方法進行過濾,代碼以下:
		if (log.isDebugEnabled()) {
		    log.debug(" From: " + req.getFrom().toString() + 
		                  " To: " + req.getTo().toString() + 
		                  " CallId: " + req.getCallId() + 
		                  " msg:" + msg);
		}
	其做用是由於Debug,Info和Trace通常會打印比較詳細的信息,並且打印的次數較多,若是咱們不加log.isDebugEnabled()等
	進行預先判斷,當系統loglevel設置高於Debug或Info或Trace時,雖然系統不會答應出這些級別的日誌,可是每次仍是會拼接
	參數字符串,影響系統的性能。
  二、錯誤的優化方法
	部分編碼人員由於不瞭解機制,從代碼複用性和簡潔性而言定義以下函數來封裝
	    private void debug(String msg) {
	        if (log.isDebugEnabled()) {
	            log.debug(msg);
	        }
	    }
	其實這種封裝方式是錯誤的,由於當系統中調用debug(msg)函數仍是出現字符串的拼接。
 
結論:這3個方法是對項目的優化方法,加這個方法目的在於若是代碼中存在鏈接字符串的狀況,打印信息時會出現太多的拼接字符串影響
       系統性能。若是系統中是固定字符串加不加均可以。  

  

log4j的使用:

##define an appender named console
log4j.appender.console=org.apache.log4j.ConsoleAppender
#The Target value is System.out or System.err(out kong zhi tai xian shi wei hei se;err kong zhi tai xian shi hong se)
log4j.appender.console.Target=System.out
#set the layout type of the apperder
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#set the layout format pattern(ri zhi ge shi)
log4j.appender.console.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss}] %c %L %m%n


##define an appender named file(shu chu dao wen jian)
log4j.appender.file=org.apache.log4j.FileAppender
#define the file path and name
log4j.appender.file.File=d:/logfile.txt
#set the layout type of the apperder
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#set the layout format pattern
log4j.appender.file.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss}] %c %L %m%n


##define an appender named rollfile(shu chu dao wen jian,dan da dao zhi ding nei cun,hui chong xin cheng cheng yi ge wen jian)
log4j.appender.rollfile=org.apache.log4j.RollingFileAppender
#define the file path and name
log4j.appender.rollfile.File=d:/logrollfile.txt
#set the log's size(zhi ding ri zhi wen jian da xiao)
log4j.appender.rollfile.MaxFileSize=10KB
#set the layout type of the apperder
log4j.appender.rollfile.layout=org.apache.log4j.PatternLayout
#set the layout format pattern
log4j.appender.rollfile.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss}] %c %L %m%n


##define a logger(zhi ding ri zhi ji bie he shi yong na xie zui jia qi)
#log4j.logger.全限定性類名或接口名=INFO,console,file,rollfile
log4j.rootLogger=INFO,console,file,rollfile

  

log4j2的使用:

<?xml version="1.0" encoding="UTF-8"?>
<-- status 是否輸出日誌中的日誌(引入了日誌的jar包) -->
<configuration status="OFF">
	<appenders>
	    <-- SYSTEM_OUT/SYSTEM_ERR -->
		<Console name="myConsole" target="SYSTEM_OUT">
			<PatternLayout pattern="[%-5p][%d{yyyy-MM-dd HH:mm:ss}] [%c %L] %m%n" />
		</Console>
		<-- append="true" 表示追加,不刪除以前的日誌;false是會刪除以前的日誌	 -->
		<File name="myLogFile" fileName="log/test.log" append="true">
            <PatternLayout pattern="[%-5p][%d{yyyy-MM-dd HH:mm:ss}] [%c %L] %m%n"/>
        </File>
		<-- logs/app.log 項目根目錄log -->
        <RollingFile name="myRollingFile" fileName="logs/app.log"
					 <-- 按月來管理日誌 log.gz 的.gz爲壓縮格式 -->
                     filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
					 
					 <--
					 按日來管理日誌  filePattern="logs/$${date:yyyy-MM-dd}/app-%d{MM-dd-yyyy}-%i.log.gz"
					 -->
					
					 
            <PatternLayout pattern="[%-5p][%d{yyyy-MM-dd HH:mm:ss}] [%c %L] %m%n"/>
			<-- 日誌文件大小,超出這個空間,會從新生成一個文件 -->
            <SizeBasedTriggeringPolicy size="1KB"/>
        </RollingFile>
	</appenders>
	
	<loggers>
		<!-- 
		<logger name="全限定類名或接口名" level="info">
			<appender-ref ref="myConsole" />
		</logger>
		 -->
		<-- 日誌輸出級別 -->
		<root level="info">
			<-- 使用那些追加器 -->
			<appender-ref ref="myConsole" />
			<!-- <appender-ref ref="myLogFile" /> -->
			<!-- <appender-ref ref="myRollingFile" /> -->
		</root>
	</loggers>
	
</configuration>

  

 

 

 

參考資料:

http://logback.qos.ch/manual/configuration.html#conditional

相關文章
相關標籤/搜索