Log4j 日志输出性能优化

Log4j 已成为大型系统必不可少的一部分,Log4j 可以很方便的帮助我们在程序的任何位置输出所要打印的信息,便于我们对系统在调试阶段和正式运行阶段对问题分析和定位。由于日志级别的不同,对系统的性能影响也是有很大的差距,日志级别越高,性能越高。

Log4j 主要分为error、warn、info、debug 四个级别,也是使用最多的四种,日志级别从左至右依次增加。

Log4j 对系统性能的影响程度主要体现在以下几方面:

  • 日志输出的目的地,输出到控制台的速度比输出到文件系统的速度要慢。
  • 日志输出格式不一样对性能也会有影响,如简单输出布局 SimpleLayout 比格式化输出布局 PatternLayout 输出速度要快。可以根据需要尽量采用简单输出布局格式输出日志信息。
  • 日志级别越低输出的日志内容就越多,对系统系能影响很大。
  • 日志输出方式的不同,对系统系能也是有一定影响的,采用异步输出方式比同步输出方式性能要高。
  • 每次接收到日志输出事件就打印一条日志内容比当日志内容达到一定大小时打印系能要低。

一、Log4j BufferedIO 与 flush BufferedIO

使用 Log4j 默认写日志的时候,默认会立即刷到文件中,如果日志写入量很大的话,会带来一定的性能损耗。所以 Log4j 提供了 BufferedIO 配置选项,如果配置 BufferedIO 为 true,则使用 BufferedWriter 进行包装,写入数据量到达 bufferSize 之后,才会真正写到文件中。

官方解释了使用 Buffer 会带来 10% ~ 20% 的性能提升,但是代价也是很明显是,假如系统退出,由于最后写入的日志 Buffer 还没满,无法写入文件会导致关键日志丢失。

文本主要解决使用 Buffer 之后,所带来的以下两个问题:

  • 当程序关闭的时候,由于一部分日志还在内存中导致的日志丢失问题
  • 由于日志无法实时输出,给问题排查带来了困难,程序报错无法立马看到报错的信息

二、Log4j AsyncAppender

This chapter requires login to view full content. You are viewing a preview.

Login to View Full Content

Course Curriculum

3

框架与 I/O:Spring、Netty 与 Web 容器

理解 Spring Boot 自动装配、AOP 与事务原理,掌握 Netty Reactor 模型及 Tomcat 连接处理机制,构建高内聚、易扩展的应用服务层。
4

高性能中间件:消息、缓存与存储

熟练运用 MySQL 索引/事务、Redis 缓存策略、Kafka/RocketMQ 消息可靠性,以及 ZooKeeper 分布式协调,搭建稳定、解耦的分布式数据底座。
6

云原生:容器化、可观测性与工程效能

通过 Docker/K8s 实现弹性部署,集成 Metrics/Logs/Traces 构建可观测体系,推动 DevOps 与自动化,让架构在云上持续交付与进化。