如何用AI技术降噪? QCon 广州“音视频架构实践”专场给你答案! 了解详情
写点什么

Apache Log4j 2.0 值得升级吗

  • 2014 年 8 月 05 日
  • 本文字数:1657 字

    阅读完需:约 5 分钟

Apache 软件基金会最近发布了Log4j 2.0 通用版本,相比之前Log4j 的1.x 版本有了很大的性能提升。本版本的灵感来自于诸如Log4j 1.x 和java.util.logging 之类的已有日志解决方案,它是经过了数年的努力从头开始编写完成的。

Log4j 2.0 引入了新的插件系统、对 properties 的支持、对基于 JSON 配置的支持和配置的自动化重载。它支持很多已有的日志框架,包括 SLF4J、Commons Logging、Apache Flum、Log4j 1.x,并提供了新的程序员 API。

Apache Logging PMC 成员 Christian Grobmeier 在 2012 年 12 月率先报道了新的 Log4j 2.0 。他是这样描述流行的 API 的:

在以前,大家是这么写的:

复制代码
if (logger.isDebugEnabled()) {
logger.debug("Hi, " + u.getA() + " " + u.getB());
}

log4j 2.0 的团队对这种写法进行了思考和改进。现在你可以这么写了:

复制代码
logger.debug("Hi, {} {}", u.getA(), u.getB());

Grobmeier 接着阐述了 API 方面更多的改进,包括 Markers Flow Tracing 。他还提到了插件架构的改进,配置的增强(使用热重载、JSON 和 properties),还有 Log4j 2.0 如何处理了 Log4j 1.x 的许多死锁问题。

Hacker News 上,有许多针对 JVM 日志框架的抱怨。Ceki Gülcü(许多 Java 日志框架的作者,其作品包括 Log4j、SLF4J 和 Logback)表达了他不喜欢Apache 模型的原因。Gülcü仍然是一名社区成员,并持续从事着 Apache Logging 的 PMC 的工作。

在 2013 年 7 月,Grobmeier 发表了另一篇标题为《 Log4j 2:性能几近于疯狂》的文章。在这篇文章里,他对 Remko Popma 的“AsyncLoggers”产生的日志吞吐量大加赞赏,并讨论了它的日志吞吐量如何能够比其他框架多出了 12 倍。

我们谈到每秒超过 18,000,000 条的消息,而其他框架在同样的环境中只能达到 1,500,000 或者更少。

我看到下面这张图表,简直不敢相信。一定是哪里搞错了吧。我反复地检查。我亲自来测试。的确像图中一样,Log4j 2 有着疯狂的速度。

你可以在 Log4j 的异步文档中找到更多的信息。

然而,并非所有人都觉得Log4j 的异步特性有多么地了不起。FullContact 的高级平台工程师 Michael Rose 写过一篇博客,名为《过度设计:Log4j2 的 AsyncAppender 》。他总结说,这个特性并不值得使用:

我认为 Log4j2 的 AsyncAppender 虽然看上去很优雅,但不过是个好看的玩具,对于任何合理的应用来说它实际上并不像评估的那么突出。Log4j2 的团队非常令人尊敬,但我真诚的希望他们更加专注于简单的、内聚的下一代 Java 日志框架,而不是把主要精力放在添加另外的日志框架上。

无论如何,Logback 是 SLF4J(构建类路径日志的实事标准)的原生实现,性能也完全合乎要求(特别是打开本地设置时)。它仍然是我对日志框架的第一选择。它使用起来很方便,而且我在使用过程中也从没有发现过什么问题。

如果没有其他方面的考虑,那就要像躲瘟疫那样躲着 Log4j 1.x。在任何具有负载的系统中,你最终都会发现它会导致竞争问题。

Log4 1.x迁移到 ****2.0

我最近把我的 AppFuse 应用从 Log4j 1.x 升级到了 2.0 ,发现它很难从 Maven dependencies 上直接获取。至少,你得需要 log4j-core JAR(它依赖于 log4j-api)。如果你要用于网络应用,还需要依赖 log4j-web。如果集成 Velocity 1.7,还必须增加 log4j-1.2-api。如果集成 Spring,还必须增加 log4j-jcl(因为它使用了 commons-logging)。对于那些依赖了 SLF4J 的类库,必须包括 log4j-slf4j-impl。如果集成 Hibernate,还必须升级 JBoss Logging 到 3.2.0.Beta1

你可能需要把某些依赖中以前的 Log4j 依赖排除掉。如果你使用 Maven,下面有个不错的命令,可以显示你可能需要排除的依赖。

复制代码
mvn dependency:tree | grep log

我最后要做的一步是把 log4j.xml 文件重命名为 log4j2.xml,并重构它们以匹配它新的配置

总结

新的Log4j 2.0 版本有了大幅的性能提升、新的插件系统,以及配置设置方面的很多改善。是否需要把当前Log4j 升级到2.0 或者将已有的日志解决方案换成Log4j 2.0 呢?有的用户可能会找到充分的理由,有的也可能还找不到。

查看英文原文: Apache Log4j 2.0 - Worth the Upgrade?

2014 年 8 月 05 日 09:3024665

评论

发布
暂无评论
发现更多内容

第二章课后习题

博博

一站式接口测试服务体系建设

DrawDe朱

接口自动化 自动化测试平台

架构师训练营第三周作业

邢永春

Spring+多线程+集合+MVC+数据结构算法 +MyBatis源码学习笔记分享

Java架构之路

Java 程序员 架构 面试 编程语言

Fedora32安装和卸载openjdk11

ilovealt

Linux Openjdk

架构师入门学习感悟三

笑春风

「架构师训练营」第 3周作业

小黄鱼

极客大学架构师训练营

Spring Data Jpa deleteAll大概了解

ilovealt

Java jpa

Week3 - 代码重构

evildracula

学习 架构

GitHub上最火的SpringCloud微服务商城系统项目,附全套教程

Java架构之路

Java 程序员 架构 面试 编程语言

Java核心基础——反射

老农小江

Java 基础

第7周总结

alpha

极客大学架构师训练营

架构师训练营第三周学习笔记

邢永春

架构师训练营第七周

我是谁

极客大学架构师训练营

CAP原理及作业

橘子皮嚼着不脆

第三周 单例

Geek_9527

单例模式样例

jorden wang

Netty源码解析 -- PoolChunk实现原理

binecy

源码 Netty 内存布局

极客时间架构师训练营 1 期 - 第 7周总结

Kaven

Week3 - 练习

evildracula

架构

工作1-3年的程序员,应该具备怎么样的技术能力?该如何提升?

Java架构师迁哥

第15周作业

Vincent

极客时间 极客大学

全链路压测在信用卡行业的实践

DrawDe朱

全链路压测

第七周作业

alpha

极客大学架构师训练营

读完Java名著《Effective Java》: 我整理了这50条技巧

Java架构之路

Java 程序员 架构 面试 编程语言

第二章学习笔记

博博

囚徒困境:跳脱思维的牢笼

多元思维力-晓陶

认知 思维 多元思维力

极客时间架构师培训 1 期 - 第 7 周作业

Kaven

架构师训练营 1 期第 7 周:性能优化(一)- 总结

piercebn

极客大学架构师训练营

Java键值对排序

ilovealt

Java

「云智公开课」百度沧海·存储

「云智公开课」百度沧海·存储

Apache Log4j 2.0值得升级吗_Java_Matt Raible_InfoQ精选文章