Log4j vs. Logback 性能比较Inside

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 看过源码有段时间了,对logback中对判定是否记录一条日志记录的优化印象比较深刻,整理如下,希望对你有所帮助。   Java的logger框架有一个重要的层级(hierarchy)的概念,按约定,是通过小数点来区别父子关系的,也就是名字为“x.y”的logger是“x.y.z”logger的parent。 Hierachy的命名规则
看过源码有段时间了,对logback中对判定是否记录一条日志记录的优化印象比较深刻,整理如下,希望对你有所帮助。
 
Java的logger框架有一个重要的层级(hierarchy)的概念,按约定,是通过小数点来区别父子关系的,也就是名字为“x.y”的logger是“x.y.z”logger的parent。
Hierachy的命名规则:
Named Hierarchy
A logger is said to be an  ancestor of another logger if its name followed by a dot is a prefix of the  descendant logger name. A logger is said to be a  parent of a  child logger if there are no ancestors between itself and the descendant logger.
这样做的好处是我们可以灵活的指定不同logger的log level和Appender targets。
Logger
Name
Assigned
Level
Inherited
Level
Added
Appenders
Additivity
Flag
Output Targets Comment
root warn
warn
A1 not applicable A1 The root logger is anonymous but can be accessed with the Logger.getRootLogger() method.
There is no default appender attached to root.
x info
info
A-x true A1, A-x Appenders of "x" and root.
x.y none
info
A-xy false A1, A-x, A-xy Appenders in "x.y" , and its parents "x" and root. Log level is info which is inherited from "x"
x.y.z
debug
debug
A-xyz true A-xyz Appenders of "x.y.z". becuase its parent "x.y" addivitity is false, so no more appenders will be added
 
因为这个hierachy的关系,在做日志输出时,logger不仅要check自己是不是满足输出条件,还要遍历其所有的Additivity为非false的parent,看parents们能不能输出日志。
 
下图是一个Filter和Handler在Logger Hierarchy中运作的示意图,其运行逻辑是:

When a message is passed to a Logger, the message is passed through the Logger's Filter, if the Loggerhas a Filter set. The Filter can either accept or reject the message. If the message is accepted, the message is forwarded to the Handler's set on the Logger. If no Filter is set, the message is always accepted.

If a message is accepted by the Filter, the message is also forwarded to the Handler's of the parentLogger's. However, when a message is passed up the hierarchy, the message is not passed through theFilter's of the parent Logger's. The Filter's are only asked to accept the message when the message is passed directly to the Logger, not when the message comes from a child Logger.

 

更多详细请参考 http://tutorials.jenkov.com/java-logging/logger-hierarchy.html
 
log4j中是怎样处理这个hierachy的呢?
 
上面的实现有两个比较损耗性能的地方:
1)当日志不需要输出时,new LoggingEvent()纯属是做无用功。
2)当logger的日志自身不满足输出条件是,遍历parents也是在做无用功。
 
logback中是怎样做优化的呢?
 
logback 还有一个比较明显的优化点(贤亮补充)

在log4j中,当某个logger调用关联的appenders进行输出前会先通过synchronized加锁,如下代码所示:

但是在logback中,只会在某个appender要输出日志时,使用ReentrantLock来进行加锁,如下代码所示:

这两者的主要区别不在于ReentrantLock和synchronized,因为最新的JVM中,这两个性能不会相差太多,主要区别在于加锁粒度上,当大并发的情况下,logback会有明显的优势,这个原理和ConcurrentHashMap的分段锁类似。

对于其他的优化点,可以考虑自己做一些性能测试+阅读源码,体会会更深一些。
 
参考:
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
26天前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
166 3
|
10天前
|
存储 Java Android开发
Android|记一个导致 logback 无法输出日志的问题
在给一个 Android 项目添加 logback 日志框架时,遇到一个导致无法正常输出日志的问题,这里记录一下。
13 2
|
10天前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
37 1
|
2月前
|
缓存 监控 算法
分析慢日志文件来优化 PHP 脚本的性能
分析慢日志文件来优化 PHP 脚本的性能
|
3月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
|
3月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
|
3月前
|
XML Java API
Java日志通关(四) - Logback 介绍
作者日常在与其他同学合作时,经常发现不合理的日志配置以及五花八门的日志记录方式,后续作者打算在团队内做一次Java日志的分享,本文是整理出的系列文章第四篇。
|
3月前
|
JavaScript Java API
Java日志通关(二) - Slf4j+Logback 整合及排包
作者日常在与其他同学合作时,经常发现不合理的日志配置以及五花八门的日志记录方式,后续作者打算在团队内做一次Java日志的分享,本文是整理出的系列文章第二篇。
|
3月前
|
XML Java Maven
logback在springBoot项目中的使用 springboot中使用日志进行持久化保存日志信息
这篇文章详细介绍了如何在Spring Boot项目中使用logback进行日志记录,包括Maven依赖配置、logback配置文件的编写,以及实现的日志持久化和控制台输出效果。
logback在springBoot项目中的使用 springboot中使用日志进行持久化保存日志信息
|
4月前
|
安全 Java
Logback 实现日志链路追踪
Logback 实现日志链路追踪
111 1