spring boot-7.日志系统

日志系统分为两部分,一部分是日志抽象层,一部分是日志实现层。常见的日志抽象层JCL,SLF4J,JBoss-Logging,日志实现层有logback,log4j,log4j2,JUL。日志抽象层的功能是提供一个统一的调用入口,而真正得日志实现功能有日志实现层来做。如果需要使用日志功能,则需要选取一个日志抽象层和一个日志实现层。

slf4j 是一个日志抽象层框架,他需要和其他日志实现框架配合才能实现日志功能,如下图所示,如果单独使用slf4j则会输出空,slf4j和logback配合使用的话,还需导入logback相关的jar包,如果和其他的日志实现框架配合使用的话,不仅需要导入日志实现框架还需要导入一个转换层,如log4j 的slf4-log4j12.jar。不管使用哪种日志实现框架,日志的配置文件还是需要使用日志实现框架的配置文件,这个文件是被日志框架直接读取的。

1.SLF4J的使用

2.如何统一使用slf4j 记录日志

由于系统导入很多依赖,每个依赖可能已经在依赖其他的的日志框架(如spring 依赖 Commons logging),如何让他们统一使用slf4j记录日志呢?sjf4j 的官方文档 中https://www.slf4j.org/legacy.html 有介绍

如上图,具体做法是:

(1)将框架已经依赖的其他日志框架先排除掉

(2)导入中间的适配层jar包(jul-to-slf4j.jar等等)

(3)再导入需要的日志实现jar包。

3.spring boot 的日志实现

Spring boot 底层的日志实现是通过slf4j + logback实现的。下图是spring boot 的依赖关系,spring-boot-starter-logging是spring boot 的日志启动器。它又分别依赖了logback-classic 和 log4j-to-slf4j,jul-to-slf4j ,这两个jar包的作用就是上面讲的,讲其他的日志框架转换成slf4j,作为一个中间适配层来使用的。

spring boot 会为我们自动适配成slf4j + logback 的日志记录框架,如果需要引入其他额外的jar包,怎么能让新引入的jar也使用上slf4j+logback 来记录日志呢?

只需要做一件就够了:如果新引入的jar包中含有其他日志框架,我们只要将这个日志框架从jar包中排除即可。spring boot 已经导入相应的适配层的包,会自动顶替被排除包的功能。例如 spring 排除commons-logging 包

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

 4.spring boot 的日志使用

spring boot 已经默认配置好了日志

Logger logger = LoggerFactory.getLogger(xxx.class);

获取日志记录器,使用loger.info 、logger.debug 等方法记录日志,如果需要调整默认的日志配置,则在全局配置文件中修改配置即可,spring boot 默认的root级别为info 级别,输出info及以上级别的日志信息。同时也可以日志的输出格式。

        %d表示日期时间,
        %thread表示线程名,
        %-5level:级别从左显示5个字符宽度
        %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 
        %msg:日志消息,
        %n是换行符

logging.file 和 logging.path 如果都不指定,则只会在控制台输出,不会在文件输出。

logging.file 可以指定生成日志文件的名称或者日志文件的名称及位置,如果不指定位置只指定了名称,在会在当前的项目路径下生成日志文件。

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

#指定日志文件大小,超过指定的值,则新建一个,默认10M

logging.file.max-size=20M

#要保存的存档日志文件的最大数量

logging.file.max-history=10

5.使用自定义的配置文件

官方文档的26.5章节开始介绍了使用自定义配置文件的办法。使用方法是在类路径上放日志框架的配置文件即可

官方推荐使用带-spring 的配置文件,带-sping 后缀的和不带后缀的区别是:带后缀的后被spring 识别,可以使用一些spring 的高级特性,不带后缀的只会被日志框架实现。

官方文档的26.6.1 和26.6.2介绍了两种告诫特性,分别是profile 和 Environment ,规定了再特殊条件下才可生效。

6.更改spring boot 默认的日志框架

如果不想使用spring boot 默认的日志框架,想切换成其他的日志实现框架。

1.从spring-boot-starter 中排除logback 的jar包

2.引入其他日志实现框架的jar包

切换成slf4j+log4j的方式:

<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>

切换成slf4j+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-08-15 14:50  脆皮香蕉  阅读(853)  评论(0编辑  收藏  举报