spring boot 学习(六)spring boot 各版本中使用 log4j2 记录日志

房东的猫 提交于 2020-07-28 19:58:32

spring boot 各版本中使用 log4j2 记录日志

前言

Spring Boot中默认日志工具是 logback,只不过我不太喜欢 logback。为了更好支持 spring boot 框架,我使用 log4j

spring boot 各版本与 log4j 的支持情况

1. spring boot 1.2.X 版本

spring boot 1.2.X 版本一般建议使用默认日志工具(logback),也可以使用 log4j。
但,注意的是:Spring Boot 1.2.4.RELEASE包含一个bug,github上关于该问题的解释。所以,当你通过application.properties定义日志级别时,该错误会更改父记录器级别,在最差情况下会更改根记录器级别。虽然这个bug是修复在1.2.6.RELEASE,我建议至少使用1.2.8.RELEASE(如果你想坚持1.2.x)。
因为 spring boot 现在仍然在快速发展阶段,版本更新较快,有时候就会因为版本问题而出现各种奇奇怪怪的bug。

2. spring boot 1.3.X 版本

spring boot 从 1.3.X 版本开始支持 slf4j+log4j/log4j2
* 首先,先解决为什么使用 SL4J Facade?
对于这个问题,网上已经有许多精彩地点答案了,我就直接附上其中一篇的地址了:为什么要使用SLF4J而不是Log4J
同时,附上一张工作流程图:




 

 

 

然后,就是在自己的 springboot 项目中使用 log4j。
补充一下,由于方法一样,我将slf4j+log4j2放到了1.4.X版本中来应用。


1.创建一个1.3.X版本的 spring boot 项目(记得排除logback-classic的依赖)。

1
2
3
4
5
6
7
8
9
10
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
       <exclusion>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-classic</artifactId>
       </exclusion>
    </exclusions>
</dependency>

2.引入 SL4J 依赖。

1
2
3
4
5
6
7
8
9
10
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version> 1.7 . 19 </version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version> 2.5 </version>
</dependency>

 3.引入 LOG4J 依赖。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version> 2.5 </version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version> 2.5 </version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-jcl</artifactId>
    <version> 2.5 </version>
</dependency>

 顺便解释一下,log4j-jcl工件是Apache Log4J Commons Logging Bridge。 如果你打算将Spring Boot application.properties日志配置路由到Log4J文件追加器,那么它是必需的。
4.添加一个测试Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import  org.slf4j.Logger;
import  org.slf4j.LoggerFactory;
import  org.springframework.stereotype.Controller;
import  org.springframework.web.bind.annotation.RequestMapping;
@Controller
public  class  LoggerController {
     private  final  Logger logger = LoggerFactory.getLogger( this .getClass());
     @RequestMapping ( "/mylog" )
     public  String index(){
         logger.debug( "This is a debug message" );
         logger.info( "This is an info message" );
         logger.warn( "This is a warn message" );
         logger.error( "This is an error message" );
         return  "success" ;
     }
}

 5.src/main/resources目录下加入log4j.properties配置文件
这个,与 spring 框架下的 log4j.properties 通常配置一样,我就简单提供一个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#LOG4J配置
#设定root日志的输出级别为INFO,appender为控制台输出stdout,文件输出为file
log4j.rootLogger=INFO,stdout,file
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p]-[%d{yyyy-MM-dd HH:mm:ss}]-[%c:%L]: %m%n
 
#只打印级别为ERROR或以上的消息。
log4j.logger.noModule=FATAL
 
#对 com.test 包下的配置
log4j.logger.com.test=DEBUG
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.freemarker=WARN
log4j.logger.com.mchange=WARN
 
#文件输出配置
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex= 5
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-5p]-[%d{yyyy-MM-dd HH:mm:ss}]-[%c:%L]: %m%n

 

6.启动项目访问 http://localhost:8080/mylog 就可以在 log.log 文件与控制台中看到日志打印的信息。

3. spring boot 1.4.X 版本

从 spring boot 1.4开始的版本就要用log4j2
1.将上一个项目中有关 log4j 与 slf4j 的有关依赖全部去掉,因为 springboot 已经帮我们集合好了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--去掉springboot本身日志依赖-->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter</artifactId>
       <exclusions>
           <exclusion>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-logging</artifactId>
           </exclusion>
       </exclusions>
   </dependency>
 
   <!--log4j2-->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-log4j2</artifactId>
   </dependency>

 2.添加 log4j2.xml 文件(与 application.properties 同级)。

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
<?xml version= "1.0"  encoding= "UTF-8" ?>
<!--启动项设置为 trace,加载 springboot 启动内部各种详细输出-->
<Configuration status= "trace" >
     <Appenders>
         <!--添加一个控制台追加器-->
         <Console name= "Console"  target= "SYSTEM_OUT"  follow= "true" >
             <PatternLayout>
                 <pattern>[%-5p] %d %c - %m%n</pattern>
             </PatternLayout>
         </Console>
         <!--添加一个文本追加器,文件位于根目录下,名为log.log-->
         <File name= "File"  fileName= "log.log" >
             <PatternLayout>
                 <pattern>[%-5p] %d %c - %m%n</pattern>
             </PatternLayout>
         </File>
     </Appenders>
     <Loggers>
         <Logger name= "com.github"  level= "debug"  />
         <!--记录 qg.fangrui.boot 包及其子包 debug 及其以上的记录,并输出到文件中-->
         <Logger name= "qg.fangrui.boot"  level= "debug" >
             <!-- AppenderRef 可以控制文件输出对象-->
             <AppenderRef ref= "File"  />
         </Logger>
         <!--根记录全部输出到控制台上-->
         <Root level= "debug" >
             <AppenderRef ref= "Console"  />
         </Root>
     </Loggers>
</Configuration>

 3.在 application.properties 中加入配置文件的扫描位置
logging.config=classpath:log4j2.xml
4.再次启动并访问 http://localhost:8080/mylog
控制台输出日志:



日志文件:
日志文件输出

4. springboot 1.4.1.RELEASE + slf4j + log4j2

参考项目地址:https://github.com/FunriLy/springboot-study/tree/master/%E6%A1%88%E4%BE%8B2

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!