logback 、log4j 和 log4j2

在 springboot 中使用 log4j 需要引入其依赖并把 springboot 自带的日志框架 logback 排除掉:

  <dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-log4j</artifactId>

    <version>1.3.8.RELEASE</version>

  </dependency>

  <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(同log4j一样,要排除 springboot 自带的日志框架):

  <dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-log4j2</artifactId>

  </dependency>

<!-- 增加识别yaml格式依赖,加上这个才能辨认到log4j2.yml文件 -->

  <dependency>

    <groupId>com.fasterxml.jackson.dataformat</groupId>

    <artifactId>jackson-dataformat-yaml</artifactId>

  </dependency>

log4j12 异步日志

到目前为止,上述的测试都是针对同步日志进行的测试。在确定了log4j12作为日志框架之后,我想看一下,使用异步日志能不能进一步提高性能表现。

AsyncAppender 和 Asynchronous Loggers

官方文档也指出:

在这种多线程应用的实践中需要主要:阻塞队列很容易发生锁争用,测试表明当大量线程并发写日志的时候,性能甚至会变得更糟糕。所以应该考虑使用无锁的Asyn Loggers进行优化。

上述的Asyn Loggerslog42 团队后来才加入的异步实现,连官方文档都推荐它了,那还有什么好犹豫的呢。它需要引入一个额外的依赖:

 <dependency>
   <groupId>com.lmax</groupId>
   <artifactId>disruptor</artifactId>
   <version>3.4.2</version>
 </dependency>

Disruptor 通过CAS而不是锁实现多生产者、多消费者对RingBuffer的并发访问,实现高吞吐和高性能。

 

全异步和混合异步

Log4j2的异步日志的使用又可以分为全异步混合异步,所谓全异步就是所有的日志都以异步方式输出;混合异步就是只有指定的代码文件用异步方式输出,其他日志使用同步方式输出;前者能够获得更高的性能,也是官方推荐的方式,后者具有更好的灵活性,可以进行针对性配置。

本文中我们直接使用全异步日志。

 

slf4j的三种实现方式

  slf4j + logback: slf4j-api.jar + logback-classic.jar + logback-core.jar

  slf4j + log4j: slf4j-api.jar + slf4j-log412.jar + log4j.jar

  slf4j + jul: slf4j-api.jar + slf4j-jdk14.jar

 

在springboot中开启全异步的方式很简单,只需要在配置文件中加如下配置(yml):

log4j12:
  contextSelector: org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

或者在用java -jar 启动的时候加入系统参数:

-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

springboot 中多环境日志配置

在springboot中我们通常针对dev,test,live等多种环境会有多套配置文件,比如application-dev.yml,application-test.ymlapplication-live.yml。然后可以在启动的时候可以通过在全局配置文件application.yml指定某个配置文件来启用配置:

sping:
  profiles:
    active: live

日志同样有这样的需求,不同环境使用不同的日志配置,比如dev或test环境需要开启的log level为DEBUG,而在live环境中却不需要。这种时候我们只需要写多套日志配置,比如log4j2-dev.ymllog4j2-test.ymllog4j2-live.yml,然后在其对应的配置文件中启用日志配置就可以了:

logging:
  config: classpath:log4j2-dev.yml
 
posted @ 2020-05-09 11:12  骑驴晒太阳  阅读(1380)  评论(0)    收藏  举报