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

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。
同时,附上一张工作流程图:
spring boot 学习(六)spring boot 各版本中使用 log4j2 记录日志_第1张图片

  • 然后,就是在自己的 springboot 项目中使用 log4j。
    补充一下,由于方法一样,我将slf4j+log4j2放到了1.4.X版本中来应用。
    1.创建一个1.3.X版本的 spring boot 项目(记得排除logback-classic的依赖)。
<dependency>
   <groupId>org.springframework.bootgroupId>
   <artifactId>spring-boot-starterartifactId>
   <exclusions>
      <exclusion>
         <groupId>ch.qos.logbackgroupId>
         <artifactId>logback-classicartifactId>
      exclusion>
   exclusions>
dependency>

2.引入 SL4J 依赖。

<dependency>
   <groupId>org.slf4jgroupId>
   <artifactId>slf4j-apiartifactId>
   <version>1.7.19version>
dependency>
<dependency>
   <groupId>org.apache.logging.log4jgroupId>
   <artifactId>log4j-slf4j-implartifactId>
   <version>2.5version>
dependency>

3.引入 LOG4J 依赖。

<dependency>
   <groupId>org.apache.logging.log4jgroupId>
   <artifactId>log4j-apiartifactId>
   <version>2.5version>
dependency>
<dependency>
   <groupId>org.apache.logging.log4jgroupId>
   <artifactId>log4j-coreartifactId>
   <version>2.5version>
dependency>
<dependency>
   <groupId>org.apache.logging.log4jgroupId>
   <artifactId>log4j-jclartifactId>
   <version>2.5version>
dependency>

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

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 通常配置一样,我就简单提供一个。

#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 已经帮我们集合好了。

      
      <dependency>
          <groupId>org.springframework.bootgroupId>
          <artifactId>spring-boot-starterartifactId>
          <exclusions>
              <exclusion>
                  <groupId>org.springframework.bootgroupId>
                  <artifactId>spring-boot-starter-loggingartifactId>
              exclusion>
          exclusions>
      dependency>

      
      <dependency>
          <groupId>org.springframework.bootgroupId>
          <artifactId>spring-boot-starter-log4j2artifactId>
      dependency>

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



<Configuration status="trace">
    <Appenders>
        
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout>
                <pattern>[%-5p] %d %c - %m%npattern>
            PatternLayout>
        Console>
        
        <File name="File" fileName="log.log">
            <PatternLayout>
                <pattern>[%-5p] %d %c - %m%npattern>
            PatternLayout>
        File>
    Appenders>
    <Loggers>
        <Logger name="com.github" level="debug" />
        
        <Logger name="qg.fangrui.boot" level="debug">
            
            <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
控制台输出日志:
spring boot 学习(六)spring boot 各版本中使用 log4j2 记录日志_第2张图片
日志文件:
日志文件输出

4. springboot 1.4.1.RELEASE + slf4j + log4j2

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

参考资料

  • https://springframework.guru/using-log4j-2-spring-boot/
  • (关于log4j的配置文件详解)http://www.it165.net/pro/html/201409/21592.html
  • (springboot+log4j)http://blog.didispace.com/springbootlog4j/

你可能感兴趣的:(spring,boot)