Log4j vs. Logback 性能比较Inside

看过源码有段时间了,对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的分段锁类似。

对于其他的优化点,可以考虑自己做一些性能测试+阅读源码,体会会更深一些。

 

参考:

https://logging.apache.org/log4j/1.2/manual.html

http://logback.qos.ch/manual/

Logger Hierarchy: http://tutorials.jenkov.com/java-logging/logger-hierarchy.html

时间: 2025-01-30 22:12:54

Log4j vs. Logback 性能比较Inside的相关文章

jdk-logging、log4j、logback日志介绍及原理

1 需要解决的疑惑 目前的日志框架有jdk自带的logging,log4j1.log4j2.logback 目前用于实现日志统一的框架apache的commons-logging.slf4j 为了理清它们的关系,与繁杂的各种集成jar包,如下: log4j.log4j-api.log4j-core log4j-1.2-api.log4j-jcl.log4j-slf4j-impl.log4j-jul logback-core.logback-classic.logback-access commo

spring-junit中使用 log4j或者logback 打印spring日志

package com.gooddeep.elasticsearch; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections.map.HashedMap; import org.apache.log4j.PropertyConfigurator; import org.junit.Test; import org.junit.runn

spring 中使用 logback打印日志,替换其他日志如log4j,commons-logging

1.  Spring MVC集成slf4j-log4j 关于slf4j和log4j的相关介绍和用法,网上有很多文章可供参考,但是关于logback的,尤其是Spring MVC集成logback的,就相对少一些了,而且其中一些也有着这样那样的问题.进入正题之前先简单介绍下Spring MVC集成slf4j-log4j的过程,如下: 1)      在pom.xml文件中添加slf4j-log4j的依赖,完成后的classpath中将新增三个jar包,分别是:slf4j-api.jar.log4j

Logback 专题

  spring boot中使用logback时一个一个配置文件示例:简单的:logback-spring.xml <?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml" /> <logger name="

从零开始玩转logback

概述 LogBack是一个日志框架,它与Log4j可以说是同出一源,都出自Ceki Gülcü之手.(log4j的原型是早前由Ceki Gülcü贡献给Apache基金会的)下载地址:http://logback.qos.ch/download.html LogBack.Slf4j和Log4j之间的关系 Slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实现,一般常配合Log

深入log4j源码

 slf4j即Simple logging facade for Java,其作用类似于JDBC,作为一个日志抽象层,它允许你在后台使用任意一个日志类库,比如log4j.如果是在编写供内外部都可以使用的API或者通用类库,那么你真不会希望使用你类库的客户端必须使用你选择的日志类库.常用的日志类库有log4j.logback等,本文就来深入了解一下log4j.  开发代码中,我们只需要在src下放上log4j.xml或log4j.properties,log4j就能自动找到该配置文件,web工程在

slf4j与jul、log4j1、log4j2、logback的集成原理

1 系列目录 jdk-logging.log4j.logback日志介绍及原理 commons-logging与jdk-logging.log4j1.log4j2.logback的集成原理 slf4j与jdk-logging.log4j1.log4j2.logback的集成原理 slf4j.jcl.jul.log4j1.log4j2.logback大总结 2 slf4j 先从一个简单的使用案例来说明 2.1 简单的使用案例 private static Logger logger=LoggerF

jcl与jul、log4j1、log4j2、logback的集成原理

1 系列目录 jdk-logging.log4j.logback日志介绍及原理 jcl与jul.log4j1.log4j2.logback的集成原理 slf4j与jdk-logging.log4j1.log4j2.logback的集成原理 slf4j.jcl.jul.log4j1.log4j2.logback大总结 前面介绍了jdk自带的logging.log4j1.log4j2.logback等实际的日志框架 对于开发者而言,每种日志都有不同的写法.如果我们以实际的日志框架来进行编写,代码就限

slf4j、jcl、jul、log4j1、log4j2、logback大总结

1 系列目录 jdk-logging.log4j.logback日志介绍及原理 commons-logging与jdk-logging.log4j1.log4j2.logback的集成原理 slf4j与jdk-logging.log4j1.log4j2.logback的集成原理 slf4j.jcl.jul.log4j1.log4j2.logback大总结 2各种jar包总结 log4j1: log4j:log4j1的全部内容 log4j2: log4j-api:log4j2定义的API log4