SpringBoot日志

日志框架的分类和选取

常见的日志框架:JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j….

日志门面 (日志的抽象层)

日志实现

JCL(Jakarta Commons Logging)、SLF4j(Simple Logging Facade for Java)、 jboss-logging

Log4j、JUL(java.util.logging)、Log4j2、Logback

 

 

 

 

左边选一个门面(抽象层)、右边来选一个实现;

日志门面 SLF4J;

日志实现Logback;

SpringBoot:底层是Spring框架,Spring框架默认是用JCL;

SpringBoot选用 SLF4j和logback;

如何在系统中使用SLF4j

在开发的时候,日志记录方法的调用,不应该直接来调日志的实现类,而是调用日志抽象层里面的方法

给系统里面导入slf4j的jar和logback的实现jar

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

图示:

每一个日志的实现框架都有自己的配置文件,使用slf4j以后,配置文件还是使用日志实现框架自己的配置文件

遗留问题

在一个项目中,我们使用了slf4j+logback做日志记录。但是我们可能还会用到Spring框架,Hibernate框架和MyBatis框架,他们所用的日志框架又各不相同,比如spring使用commons-loggingHibernate可能使用jboss-logging等,那么这就显得非常混乱了,这时候我们就需要将日志框架统一,统一使用slf4j

如何让系统中所有的日志都统一到slf4j

  • 将系统中其他日志框架先排除出去

  •  用中间包来替换原有的日志框架

  •  我们导入slf4j实现

上面的三步的解释是:例如spring框架使用的是commons-logging,那么Spring框架里面相关的日志记录方法一定也是使用的commons-logging的,那么如果这时去掉commons-logging加入别的日志框架就一定会报错,因为不同的框架使用的方法不同,而spring框架里面还是用的commons-logging的方法。那么应该怎么办呢?又不能去更改spring的源码,那这个问题就显得非常棘手了。不过好在也不是真的没有解决办法,如果在slf4j与spring框架中间再添加一个包,这个包里面有所有原来commons-logging的方法,但是这些方法却是由slf4j实现的,那不就将问题解决了?掩住了spring的耳目使用了slf4j了!那么接下来就来看看SpringBoot的日志底层依赖吧

SpringBoot的日志底层依赖关系

总结:

  • SpringBoot底层也是使用slf4j+logback的方式进行日志记录

  • SpringBoot已经把其他的日志替换成了slf4j

  • 如果我们要引入其他框架,一定要把这个框架默认的日志依赖包移除掉

就上面第三点以在SpringBoot中使用spring为例,看看是怎样排除日志依赖包的

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <exclusions>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>

SpringBoot做日志的核心总结:SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志。引入其他框架的时候。只需要把这个框架依赖的日志框架排除掉,不用再做其他的任何操作

日志的使用

默认配置

SpringBoot默认帮我们配置好了日志,我们直接使用

// 记录器
Logger logger = LoggerFactory.getLogger(getClass());

@Test
public void contextLoads() {
    // 日志级别, 由低到高 trace < debug < info < warn < error
    // 可以通过调整日志级别来输出这个级别及以上的级别的日志
    // SpringBoot默认使用的是info级别,没有指定级别就是用默认规定的级别,即root级别 
    logger.trace("这是trace日志。。。");
    logger.debug("这是debug日志。。。");
    logger.info("这是info日志。。。");
    logger.warn("这是warn日志。。。");
    logger.error("这是error日志。。。");
}

properties中配置日志级别

logging.level.com.jinxin=trace  # 配置级别为trace,这里是将com.jinxin包下面的所有类的级别调成trace级别

logging.file=springboot.log   # 指定日志输出文件,默认在当前项目下生成,也可以指定路径,如:G:/springboot.log

# logging.path与logging.file是一对冲突设置,指定路径时二者选其一就好,一般选择logging.path
# /表示在当前磁盘的根目录下创建目录,默认以springboot.log作为日志记录
logging.path=/spring/log


# 在控制台输出的日志格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 在文件中输出的日志格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n

指定配置

给类路径下放上每个日志框架自己的配置文件即可;SpringBoot就不使用他默认配置的了

Logging System

Customization

Logback

logback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy

Log4j2

log4j2-spring.xml or log4j2.xml

JDK (Java Util Logging)

logging.properties

 

 

 

 

 

 

 

logback.xml:直接就被日志框架识别了;

logback-spring.xml不会直接被日志框架识别,由SpringBoot解析日志配置,可以使用SpringBoot的高级profile功能

<springProfile name="staging">
    <!-- configuration to be enabled when the "staging" profile is active -->
    可以指定某段配置只在某个环境下生效
</springProfile>

例如logback-spring.xml中指定不同的开发环境输出不同的格式

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!--
        日志输出格式:
      %d表示日期时间,
      %thread表示线程名,
      %-5level:级别从左显示5个字符宽度
      %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 
      %msg:日志消息,
      %n是换行符
        -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <springProfile name="dev">       <!-- 开发环境怎样输出 -->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>
            </springProfile>
            <springProfile name="!dev">        <!-- 非开发环境怎样输出 -->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern>
            </springProfile>
        </layout>
    </appender>

注意:想要使用上述的SpringBoot的profile功能,那么配置文件就必须命名为logback-spring.xml,如果命名为了logback.xml还使用了profile功能,那么日志框架就会报错,说找不到这个功能 no applicable action for [springProfile] 

由此可见配置文件命名为logback.xmllogback-spring.xml的区别,即使用logback.xml的时候是将文件交给日志框架处理的,而使用logback-spring.xml的时候是将文件交给springBoot处理的

切换日志框架(不推荐)

我们可以按照slf4j的日志适配图,进行相关的切换;

例如将SpringBoot底层的日志框架切换成 slf4j+log4j 

pom.xml中导入依赖即可

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <exclusions>
    <exclusion>
      <artifactId>logback-classic</artifactId>
      <groupId>ch.qos.logback</groupId>
    </exclusion>
    <exclusion>
      <artifactId>log4j-over-slf4j</artifactId>
      <groupId>org.slf4j</groupId>
    </exclusion>
  </exclusions>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
</dependency>

如果要将日志框架更换为log4j2也可以使用同样的方式

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-logging</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

 

posted @ 2018-09-08 10:45  Jin同学  阅读(133)  评论(0)    收藏  举报