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>

log4j2 异步日志

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

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

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

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

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM