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