java應(yīng)用中,日志一般分為以下5個(gè)級(jí)別:
- error 錯(cuò)誤信息
- warn 警告信息
- info 一般信息
- debug 調(diào)試信息
- trace 跟蹤信息
spring boot使用apache的commons logging作為內(nèi)部的日志框架,其僅僅是一個(gè)日志接口,在實(shí)際應(yīng)用中需要為該接口來指定相應(yīng)的日志實(shí)現(xiàn)。
springbt默認(rèn)的日志實(shí)現(xiàn)是java util logging,是jdk自帶的日志包,此外springbt當(dāng)然也支持log4j、logback這類很流行的日志實(shí)現(xiàn)。
統(tǒng)一將上面這些 日志實(shí)現(xiàn) 統(tǒng)稱為 日志框架
下面我們來實(shí)踐一下!
使用spring boot logging插件
首先application.properties文件中加配置:
1
|
logging.level.root=info |
控制器部分代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package com.hansonwang99.controller; import com.hansonwang99.k8sresctrlapplication; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.web.bind.annotation.getmapping; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller; @restcontroller @requestmapping ( "/testlogging" ) public class loggingtestcontroller { private static logger logger = loggerfactory.getlogger(k8sresctrlapplication. class ); @getmapping ( "/hello" ) public string hello() { logger.info( "test logging..." ); return "hello" ; } } |
運(yùn)行結(jié)果
由于將日志等級(jí)設(shè)置為info,因此包含info及以上級(jí)別的日志信息都會(huì)打印出來
這里可以看出,很多大部分的info日志均來自于springbt框架本身,如果我們想屏蔽它們,可以將日志級(jí)別統(tǒng)一先全部設(shè)置為error,這樣框架自身的info信息不會(huì)被打印。然后再將應(yīng)用中特定的包設(shè)置為debug級(jí)別的日志,這樣就可以只看到所關(guān)心的包中的debug及以上級(jí)別的日志了。
控制特定包的日志級(jí)別
application.yml中改配置
1
2
3
4
|
logging: level: root: error com.hansonwang99.controller: debug |
很明顯,將root日志級(jí)別設(shè)置為error,然后再將 com.hansonwang99.controller
包的日志級(jí)別設(shè)為debug,此即:即先禁止所有再允許個(gè)別的 設(shè)置方法
控制器代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package com.hansonwang99.controller; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.web.bind.annotation.getmapping; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller; @restcontroller @requestmapping ( "/testlogging" ) public class loggingtestcontroller { private logger logger = loggerfactory.getlogger( this .getclass()); @getmapping ( "/hello" ) public string hello() { logger.info( "test logging..." ); return "hello" ; } } |
運(yùn)行結(jié)果
可見框架自身的info級(jí)別日志全部藏匿,而指定包中的日志按級(jí)別順利地打印出來
將日志輸出到某個(gè)文件中
1
2
3
4
5
|
logging: level: root: error com.hansonwang99.controller: debug file: ${user.home}/logs/hello.log |
運(yùn)行結(jié)果
使用spring boot logging,我們發(fā)現(xiàn)雖然日志已輸出到文件中,但控制臺(tái)中依然會(huì)打印一份,發(fā)現(xiàn)用 org.slf4j.logger
是無法解決這個(gè)問題的
集成log4j日志框架
pom.xml中添加依賴
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> <exclusions> <exclusion> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-logging</artifactid> </exclusion> </exclusions> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-log4j2</artifactid> </dependency> |
在resources目錄下添加 log4j2.xml
文件,內(nèi)容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?xml version= "1.0" encoding= "utf-8" ?> <configuration> <appenders> <file name= "file" filename= "${sys:user.home}/logs/hello2.log" > <patternlayout pattern= "%d{hh:mm:ss,sss} %p %c (%l) - %m%n" /> </file> </appenders> <loggers> <root level= "error" > <appender-ref ref= "file" /> </root> <logger name= "com.hansonwang99.controller" level= "debug" /> </loggers> </configuration> |
其他代碼都保持不變
運(yùn)行程序發(fā)現(xiàn)控制臺(tái)沒有日志輸出,而hello2.log文件中有內(nèi)容,這符合我們的預(yù)期:
而且日志格式和 pattern="%d{hh:mm:ss,sss} %p %c (%l) - %m%n"
格式中定義的相匹配
log4j更進(jìn)一步實(shí)踐
pom.xml配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> <exclusions> <exclusion> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-logging</artifactid> </exclusion> </exclusions> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-log4j2</artifactid> </dependency> |
log4j2.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 status= "warn" > <properties> <property name= "app_name" >springboot-web</property> <property name= "log_path" >logs/${app_name}</property> </properties> <appenders> <console name= "console" target= "system_out" > <patternlayout pattern= "[%d][%t][%p][%l] %m%n" /> </console> <rollingfile name= "rollingfileinfo" filename= "${log_path}/info.log" filepattern= "${log_path}/$${date:yyyy-mm}/info-%d{yyyy-mm-dd}-%i.log.gz" > <filters> <thresholdfilter level= "info" /> <thresholdfilter level= "warn" onmatch= "deny" onmismatch= "neutral" /> </filters> <patternlayout pattern= "[%d][%t][%p][%c:%l] %m%n" /> <policies> <!-- 歸檔每天的文件 --> <timebasedtriggeringpolicy interval= "1" modulate= "true" /> <!-- 限制單個(gè)文件大小 --> <sizebasedtriggeringpolicy size= "2 mb" /> </policies> <!-- 限制每天文件個(gè)數(shù) --> <defaultrolloverstrategy compressionlevel= "0" max= "10" /> </rollingfile> <rollingfile name= "rollingfilewarn" filename= "${log_path}/warn.log" filepattern= "${log_path}/$${date:yyyy-mm}/warn-%d{yyyy-mm-dd}-%i.log.gz" > <filters> <thresholdfilter level= "warn" /> <thresholdfilter level= "error" onmatch= "deny" onmismatch= "neutral" /> </filters> <patternlayout pattern= "[%d][%t][%p][%c:%l] %m%n" /> <policies> <!-- 歸檔每天的文件 --> <timebasedtriggeringpolicy interval= "1" modulate= "true" /> <!-- 限制單個(gè)文件大小 --> <sizebasedtriggeringpolicy size= "2 mb" /> </policies> <!-- 限制每天文件個(gè)數(shù) --> <defaultrolloverstrategy compressionlevel= "0" max= "10" /> </rollingfile> <rollingfile name= "rollingfileerror" filename= "${log_path}/error.log" filepattern= "${log_path}/$${date:yyyy-mm}/error-%d{yyyy-mm-dd}-%i.log.gz" > <thresholdfilter level= "error" /> <patternlayout pattern= "[%d][%t][%p][%c:%l] %m%n" /> <policies> <!-- 歸檔每天的文件 --> <timebasedtriggeringpolicy interval= "1" modulate= "true" /> <!-- 限制單個(gè)文件大小 --> <sizebasedtriggeringpolicy size= "2 mb" /> </policies> <!-- 限制每天文件個(gè)數(shù) --> <defaultrolloverstrategy compressionlevel= "0" max= "10" /> </rollingfile> </appenders> <loggers> <root level= "info" > <appender-ref ref= "console" /> <appender-ref ref= "rollingfileinfo" /> <appender-ref ref= "rollingfilewarn" /> <appender-ref ref= "rollingfileerror" /> </root> </loggers> </configuration> |
控制器代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package com.hansonwang99.controller; import org.apache.logging.log4j.logmanager; import org.apache.logging.log4j.logger; import org.springframework.web.bind.annotation.getmapping; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller; @restcontroller @requestmapping ( "/testlogging" ) public class loggingtestcontroller { private final logger logger = logmanager.getlogger( this .getclass()); @getmapping ( "/hello" ) public string hello() { for ( int i= 0 ;i<10_0000;i++){ logger.info( "info execute index method" ); logger.warn( "warn execute index method" ); logger.error( "error execute index method" ); } return "my first springboot application" ; } } |
運(yùn)行結(jié)果
日志會(huì)根據(jù)不同的級(jí)別存儲(chǔ)在不同的文件,當(dāng)日志文件大小超過2m以后會(huì)分多個(gè)文件壓縮存儲(chǔ),生產(chǎn)環(huán)境的日志文件大小建議調(diào)整為20-50mb。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://juejin.im/post/5abc3bc0f265da237b2227e7