44

博客园Logo
首页
新闻
博问
专区
闪存
班级

代码改变世界
搜索
注册
登录
返回主页
沉默王二
微信搜索「沉默王二」,回复 1024
博客园
首页
新随笔
联系
订阅
管理
讲武德,你们要的高性能日志工具 Log4j2,来了

Log4j 介绍过了,SLF4J 介绍过了,Logback 也介绍过了,你以为日志系列的文章就到此终结了?

不不不,我告诉你,还有一个 Log4j 2,顾名思义,它就是 Log4j 的升级版,就好像手机里面的 Pro 版。我作为一个写文章方面的工具人,或者叫打工人,怎么能不写完这最后一篇。

Log4j、SLF4J、Logback 是一个爹——Ceki Gulcu,但 Log4j 2 却是例外,它是 Apache 基金会的产品。

SLF4J 和 Logback 作为 Log4j 的替代品,在很多方面都做了必要的改进,那为什么还需要 Log4j 2 呢?我只能说 Apache 基金会的开发人员很闲,不,很拼,要不是他们这种精益求精的精神,这个编程的世界该有多枯燥,毕竟少了很多可以用“拿来就用”的轮子啊。

上一篇也说了,老板下死命令要我把日志系统切换到 Logback,我顺利交差了,老板很开心,夸我这个打工人很敬业。为了表达对老板的这份感谢,我决定偷偷摸摸地试水一下 Log4j 2,尽管它还不是个成品,可能会会项目带来一定的隐患。但谁让咱是一个敬岗爱业的打工人呢。

01、Log4j 2 强在哪

1)在多线程场景下,Log4j 2 的吞吐量比 Logback 高出了 10 倍,延迟降低了几个数量级。这话听起来像吹牛,反正是 Log4j 2 官方自己吹的。

Log4j 2 的异步 Logger 使用的是无锁数据结构,而 Logback 和 Log4j 的异步 Logger 使用的是 ArrayBlockingQueue。对于阻塞队列,多线程应用程序在尝试使日志事件入队时通常会遇到锁争用。

下图说明了多线程方案中无锁数据结构对吞吐量的影响。 Log4j 2 随着线程数量的扩展而更好地扩展:具有更多线程的应用程序可以记录更多的日志。其他日志记录库由于存在锁竞争的关系,在记录更多线程时,总吞吐量保持恒定或下降。这意味着使用其他日志记录库,每个单独的线程将能够减少日志记录。

性能方面是 Log4j 2 的最大亮点,至于其他方面的一些优势,比如说下面这些,可以忽略不计,文字有多短就代表它有多不重要。

2)Log4j 2 可以减少垃圾收集器的压力。

3)支持 Lambda 表达式。

4)支持自动重载配置。

02、Log4j 2 使用示例

废话不多说,直接实操开干。理论知识有用,但不如上手实操一把,这也是我多年养成的一个“不那么良好”的编程习惯:在实操中发现问题,解决问题,寻找理论基础。

第一步,在 pom.xml 文件中添加 Log4j 2 的依赖:

org.apache.logging.log4j log4j-api 2.5 org.apache.logging.log4j log4j-core 2.5 (这个 artifactId 还是 log4j,没有体现出来 2,而在 version 中体现,多少叫人误以为是 log4j)

第二步,来个最简单的测试用例:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Demo {
private static final Logger logger = LogManager.getLogger(Demo.class);
public static void main(String[] args) {
logger.debug(“log4j2”);
}
}
运行 Demo 类,可以在控制台看到以下信息:

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
Log4j 2 竟然没有在控制台打印“ log4j2”,还抱怨我们没有为它指定配置文件。在这一点上,我就觉得它没有 Logback 好,毕竟人家会输出。

这对于新手来说,很不友好,因为新手在遇到这种情况的时候,往往不知所措。日志里面虽然体现了 ERROR,但代码并没有编译出错或者运行出错,凭什么你不输出?

那作为编程老鸟来说,我得告诉你,这时候最好探究一下为什么。怎么做呢?

我们可以复制一下日志信息中的关键字,比如说:“No log4j2 configuration file found”,然后在 Intellij IDEA 中搜一下,如果你下载了源码和文档的话,不除意外,你会在 ConfigurationFactory 类中搜到这段话。

可以在方法中打个断点,然后 debug 一下,你就会看到下图中的内容。

通过源码,你可以看得到,Log4j 2 会去寻找 4 种类型的配置文件,后缀分别是 properties、yaml、json 和 xml。前缀是 log4j2-test 或者 log4j2。

得到这个提示后,就可以进行第三步了。

第三步,在 resource 目录下增加 log4j2-test.xml 文件(方便和 Logback 做对比),内容如下所示:

<?xml version="1.0" encoding="UTF-8"?> Log4j 2 的配置文件格式和 Logback 有点相似,基本的结构为 < Configuration> 元素,包含 0 或多个 < Appenders> 元素,其后跟 0 或多个 < Loggers> 元素,里面再跟最多只能存在一个的 < Root> 元素。

1)配置 appender,也就是配置日志的输出目的地。

有 Console,典型的控制台配置信息上面你也看到了,我来简单解释一下里面 pattern 的格式:

%d{HH:mm:ss.SSS} 表示输出到毫秒的时间

%t 输出当前线程名称

%-5level 输出日志级别,-5 表示左对齐并且固定输出 5 个字符,如果不足在右边补空格

%logger 输出 logger 名称,最多 36 个字符

%msg 日志文本

%n 换行

顺带补充一下其他常用的占位符:

%F 输出所在的类文件名,如 Demo.java

%L 输出行号

%M 输出所在方法名

%l 输出语句所在的行数, 包括类名、方法名、文件名、行数

%p 输出日志级别

%c 输出包名,如果后面跟有 {length.} 参数,比如说 %c{1.},它将输出报名的第一个字符,如 com.itwanger 的实际报名将只输出 c.i

再次运行 Demo 类,就可以在控制台看到打印的日志信息了:

10:14:04.657 [main] DEBUG com.itwanger.Demo - log4j2
2)配置 Loggers,指定 Root 的日志级别,并且指定具体启用哪一个 Appenders。

3)自动重载配置。

Logback 支持自动重载配置,Log4j 2 也支持,那想要启用这个功能也非常简单,只需要在 Configuration 元素上添加 monitorInterval 属性即可。

... 注意值要设置成非零,上例中的意思是至少 30 秒后检查配置文件中的更改。最小间隔为 5 秒。

03、Async 示例

除了 Console,还有 Async,可以配合文件的方式来异步写入,典型的配置信息如下所示:

%d %p %c [%t] %m%n 对比 Logback 的配置文件来看,Log4j 2 真的复杂了一些,不太好用,就这么直白地说吧!但自己约的,含着泪也得打完啊。把这个 Async 加入到 Appenders: %d %p %c [%t] %m%n 再次运行 Demo 类,可以在项目根路径下看到一个 debug.log 文件,内容如下所示:

2020-10-30 09:35:49,705 DEBUG com.itwanger.Demo [main] log4j2
04、RollingFile 示例

当然了,Log4j 和 Logback 我们都配置了 RollingFile,Log4j 2 也少不了。RollingFile 会根据 Triggering(触发)策略和 Rollover(过渡)策略来进行日志文件滚动。如果没有配置 Rollover,则使用 DefaultRolloverStrategy 来作为 RollingFile 的默认配置。

触发策略包含有,基于 cron 表达式(源于希腊语,时间的意思,用来配置定期执行任务的时间格式)的 CronTriggeringPolicy;基于文件大小的 SizeBasedTriggeringPolicy;基于时间的 TimeBasedTriggeringPolicy。

过渡策略包含有,默认的过渡策略 DefaultRolloverStrategy,直接写入的 DirectWriteRolloverStrategy。一般情况下,采用默认的过渡策略即可,它已经足够强大。

来看第一个基于 SizeBasedTriggeringPolicy 和 TimeBasedTriggeringPolicy 策略,以及缺省 DefaultRolloverStrategy 策略的配置示例:

%d %p %c{1.} [%t] %m%n 为了验证文件的滚动策略,我们调整一下 Demo 类,让它多打印点日志:

for (int i = 1;i < 20; i++) {
logger.debug(“微信搜索「{}」,回复关键字「{}」,有惊喜哦”,“沉默王二”, “java”);
}
再次运行 Demo 类,可以看到根目录下多了 3 个日志文件:

结合日志文件名,再来看 RollingFile 的配置,就很容易理解了。

1)fileName 用来指定文件名。

2)filePattern 用来指定文件名的模式,它取决于过渡策略。

由于配置文件中没有显式指定过渡策略,因此 RollingFile 会启用默认的 DefaultRolloverStrategy。

先来看一下 DefaultRolloverStrategy 的属性:

再来看 filePattern 的值 rolling-%d{yyyy-MM-dd}-%i.log,其中 %d{yyyy-MM-dd} 很好理解,就是年月日;其中 %i 是什么意思呢?

第一个日志文件名为 rolling.log(最近的日志放在这个里面),第二个文件名除去日期为 rolling-1.log,第二个文件名除去日期为 rolling-2.log,根据这些信息,你能猜到其中的规律吗?

其实和 DefaultRolloverStrategy 中的 max 属性有关,目前使用的默认值,也就是 7,那就当 rolling-8.log 要生成的时候,删除 rolling-1.log。可以调整 Demo 中的日志输出量来进行验证。

3)SizeBasedTriggeringPolicy,基于日志文件大小的时间策略,大小以字节为单位,后缀可以是 KB,MB 或 GB,例如 20 MB。

再来看一个日志文件压缩的示例,来看配置:



%d %p %c{1.} [%t] %m%n





fileName 的属性值中包含了一个目录 gz,也就是说日志文件都将放在这个目录下。

filePattern 的属性值中增加了一个 gz 的后缀,这就表明日志文件要进行压缩了,还可以是 zip 格式。

运行 Demo 后,可以在 gz 目录下看到以下文件:

到此为止,Log4j 2 的基本使用示例就已经完成了。测试环境搞定,我去问一下老板,要不要在生产环境下使用 Log4j 2。

04、日志手册

到此为止,日志系统的全家桶 Log4j、SLF4J、Logback、Log4j 2 都被我搞定了。也就意味着,一份将近 2 万字的 PDF 诞生了!MD,我也要成为肝帝!

有了这份 PDF,硬气地告诉 Leader 或者老板吧,再也不用担心代码中会乱打印日志了。墙都不扶就服你。

地址我贴一下:

链接:https://pan.baidu.com/s/1dPwsQhT5OMVapE7hGi7vww 密码:fxxy
偷偷地告诉你吧,白嫖的感觉就是舒服,赶紧去下载吧!顺带点个赞,满足一下我的虚荣心,毕竟这是你们赐给我的最强的写作动力。

微信扫描左侧二维码,关注作者的微信公众号:「沉默王二」
后台回复“666”即可获取一份 500G 的高清教学视频,并且已经分门别类,可以按需下载,速去!

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果觉得还有帮助的话,可以点一下右下角的【推荐】。
分类: 有趣Java
标签: log4j2
好文要顶 关注我 收藏该文
沉默王二
关注 - 7
粉丝 - 909
+加关注
0 5
« 上一篇: 入坑 docsify,一款神奇的文档生成利器!
posted @ 2020-11-23 10:09 沉默王二 阅读(109) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
登录后才能发表评论,立即 登录 或 注册, 访问 网站首页
博客园派送云上免费午餐,AWS注册立享12个月免费套餐
【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】博客园 & 陌上花开HIMMR 给单身的程序员小哥哥助力脱单啦~
【推荐】从零开始的RPG游戏制作教程,来《魔兽争霸III》共同成长
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动
【福利】AWS携手博客园为开发者送免费套餐与抵扣券
【推荐】 阿里云折扣价格返场,错过再等一年

相关博文:
· lombok + slf4j + log4j2
· log4j2配置
· log4j2 + slf4j
· log4j2配置
· spring boot整合Log4j2
» 更多推荐…
声网专区
最新 IT 新闻:
· 深度剖析:针对深度学习的GPU共享
· 特斯拉玻璃车顶被大风刮飞!秒变“敞篷车”
· 统信UOS首次公布软件适配:QQ、微信、迅雷都有了
· 麒麟操作系统公布首批信创应用:总计189款
· 拿下高通4G芯片:华为的春天来了吗?
» 更多新闻…
公告
二哥的新书《Web 全栈开发进阶之路》出版了!
Web全栈开发进阶之路
查看详情
昵称: 沉默王二
园龄: 3年8个月
粉丝: 909
关注: 7
+加关注
积分与排名
积分 - 370692
排名 - 1121
随笔分类
程序人生(122)
有趣Java(154)
最新评论

  1. Re:入坑 docsify,一款神奇的文档生成利器!
    github ok了,gitee就是404呢
    –一个土豆一棵青菜
  2. Re:拜托,别再问我怎么自学 Java 了!和盘托出
    想找一份实习的话需要这么久吗
    并且我现在是在抽时间学java,一天只能学三四个小时,不知道多长时间可以到找实习的水平
    (没什么基础)
    谢谢
    –ImmerZ
  3. Re:应届毕业生,只会抄代码,该怎么办?
    小白疑问,代码不是不应该照着抄吗,看完之后自己去回忆着写出来
    –ImmerZ
  4. Re:自学编程的 6 个致命误区
    说得太好了,这咱必须得赞一个
    –ImmerZ
  5. Re:阿里巴巴开发手册强制使用SLF4J作为门面担当的秘密,我搞清楚了
    那么多如下图,原谅我一张图都没看到

–陈本布衣
阅读排行榜

  1. IDEA 如何自动导入(import)(21073)
  2. 996:只要能活着就好,不管活得多么糟糕(16885)
  3. 为了完成月入三万的目标,我都做了哪些准备?(14373)
  4. 29岁了还一事无成是人生的常态?(8899)
  5. 为什么我不建议你通过 Python 去找工作?(7435)
    评论排行榜
  6. 996:只要能活着就好,不管活得多么糟糕(163)
  7. 29岁了还一事无成是人生的常态?(146)
  8. 为了完成月入三万的目标,我都做了哪些准备?(98)
  9. 窝在二线城市很难受,要杀回一线城市重造吗?(86)
  10. 我没回老家过春节的那4点原因(78)
    推荐排行榜
  11. 996:只要能活着就好,不管活得多么糟糕(159)
  12. 为了完成月入三万的目标,我都做了哪些准备?(63)
  13. 29岁了还一事无成是人生的常态?(50)
  14. 你的青春,值得献给小型创业公司吗?(35)
  15. 窝在二线城市很难受,要杀回一线城市重造吗?(28)
    Copyright © 2020 沉默王二
    Powered by .NET 5.0.0 on Kubernetes
    站长统计
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值