java应用中,日志一般分为以下5个级别:
- error 错误信息
- warn 警告信息
- info 一般信息
- debug 调试信息
- trace 跟踪信息
spring boot使用apache的commons logging作为内部的日志框架,其仅仅是一个日志接口,在实际应用中需要为该接口来指定相应的日志实现。
springbt默认的日志实现是java util logging,是jdk自带的日志包,此外springbt当然也支持log4j、logback这类很流行的日志实现。
统一将上面这些 日志实现 统称为 日志框架
下面我们来实践一下!
使用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" ; } } |
运行结果
由于将日志等级设置为info,因此包含info及以上级别的日志信息都会打印出来
这里可以看出,很多大部分的info日志均来自于springbt框架本身,如果我们想屏蔽它们,可以将日志级别统一先全部设置为error,这样框架自身的info信息不会被打印。然后再将应用中特定的包设置为debug级别的日志,这样就可以只看到所关心的包中的debug及以上级别的日志了。
控制特定包的日志级别
application.yml中改配置
1
2
3
4
|
logging: level: root: error com.hansonwang99.controller: debug |
很明显,将root日志级别设置为error,然后再将 com.hansonwang99.controller
包的日志级别设为debug,此即:即先禁止所有再允许个别的 设置方法
控制器代码
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" ; } } |
运行结果
可见框架自身的info级别日志全部藏匿,而指定包中的日志按级别顺利地打印出来
将日志输出到某个文件中
1
2
3
4
5
|
logging: level: root: error com.hansonwang99.controller: debug file: ${user.home}/logs/hello.log |
运行结果
使用spring boot logging,我们发现虽然日志已输出到文件中,但控制台中依然会打印一份,发现用 org.slf4j.logger
是无法解决这个问题的
集成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
文件,内容如下:
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> |
其他代码都保持不变
运行程序发现控制台没有日志输出,而hello2.log文件中有内容,这符合我们的预期:
而且日志格式和 pattern="%d{hh:mm:ss,sss} %p %c (%l) - %m%n"
格式中定义的相匹配
log4j更进一步实践
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" /> <!-- 限制单个文件大小 --> <sizebasedtriggeringpolicy size= "2 mb" /> </policies> <!-- 限制每天文件个数 --> <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" /> <!-- 限制单个文件大小 --> <sizebasedtriggeringpolicy size= "2 mb" /> </policies> <!-- 限制每天文件个数 --> <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" /> <!-- 限制单个文件大小 --> <sizebasedtriggeringpolicy size= "2 mb" /> </policies> <!-- 限制每天文件个数 --> <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" ; } } |
运行结果
日志会根据不同的级别存储在不同的文件,当日志文件大小超过2m以后会分多个文件压缩存储,生产环境的日志文件大小建议调整为20-50mb。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://juejin.im/post/5abc3bc0f265da237b2227e7