当前位置: 首页 > news >正文

轻量级 Java 日志组件

日志记录功能在开发中很常用,不仅可以记录程序运行的细节,方便调试,也可以记录用户的行为,是框架中不可或缺的组件。为最大程度复用现有的组件,我们就地取材使用了 JDK 自带的 JUL(java.util.logging)作为日志组件,并对其进行功能上的增强。这是笔者 17 年的时候就研究过了(见博客《100 行代码打造日志组件》)。时至今日,感觉还是使用 Slf4J API 的人群多,顺应潮流,决定打造兼容 Slf4J 风格的整合,使用上也更便捷,可结合 Lombok 强大的功能,在类身上施加一个注解即可。

使用方式

该组件是笔者框架里的一部分,当然单独拎出来有很简单。笔者的框架依赖:

<dependency><groupId>com.ajaxjs</groupId><artifactId>ajaxjs-framework</artifactId><version>1.1.3</version>
</dependency>

依赖 Slf4J 到你的工程,或者已经有了就不用依赖(大的概率有,因为整合 Slf4J 很普遍)。当前还是可以 1.7.x 版本的,2.x 版到时再升级。

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.36</version><scope>compile</scope>
</dependency>

组件源码在:https://gitee.com/sp42_admin/ajaxjs/tree/master/aj-backend/aj-framework/aj-framework/src/main/java/com/ajaxjs/util/logger。

调用例子

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;@Slf4j
public class TestSlf4J {@Testpublic void test() {Logger logger = LoggerFactory.getLogger(TestSlf4J.class);logger.info("Hello World 1");log.info("Hello World 2");log.info("Hello {}, it's {} day.2", "Frank", "good");log.info("Hello {}, it's {} day{}2", "Frank", "good", "?");log.debug("Hello World3");log.debug("Hello {}, it's {} day.3", "Frank", "good");log.debug("Hello {}, it's {} day{}3", "Frank", "good", "?");log.warn("Hello {}, it's {} day{}4", "Frank", "good", "?");}
}

在这里插入图片描述

功能回顾

之前组件的要点如下

在这里插入图片描述

现在某些地方会根据 Slf4J 有所调整。

  • 参数插值。默认 JUL 就有,是这样子的LOGGER.info("Hello {0}, it's {1} day{2}", "Frank", "good", "?");; Slf4J 的更简单,是 log.info("Hello {}, it's {} day{}", "Frank", "good", "?");,不要求填序号。如下例,是调用 Slf4J 的MessageFormatter.arrayFormat(format, arguments).getMessage()完成。
    在这里插入图片描述
  • 不同颜色的输出日志。这个照旧,要自己封装,Slf4J 不管这个。实质就是加入 ANSI 的颜色代码,哪怕System.out.println()都可以有颜色。值得二提的是:目前新版的 Eclipse/IDEA 都直接支持 ANSI 彩色日志,不需要另外安装插件;推荐一个 SSH 工具 WindTerm,很多 SSH 客户端没彩色效果,它就有。
  • 获取日志所在调用类、行数。这个照旧,要自己封装,Slf4J 不管这个。实质就是调用运行栈的信息了。
  • 另外保存日志文件。这个照旧,还增加适合 ELK 的 JSON 输出。

具体实现原理可参见博客《100 行代码打造日志组件》,这里不再赘述。

整合 Slf4J

最开始的时候,我想少敲点键盘,把原来声明日志的:

在这里插入图片描述

通过强大的 Lombok 改为这样的:

在这里插入图片描述

其中一个途径是配置 Lombok 自定义日志,但这样涉及 Lombok 的全局配置,比较底层和麻烦,后来就考查这个 Slf4J,发现整合自己的日志组件也不是太麻烦,两者权衡于是就决定采用后者。调用者是无感知的,他只要会 Slf4J 打日志就行。

通过这几篇文章(一、二、三和官方 JUL 适配)的学习,得知这是一种桥接的方式引入日志组件,过程不算复杂。而且更重要的是,学习了如何静态化去引入配置,这在我设计 JSON 序列化适配就遇到的难题,如何无需复杂配置就可以提供一个 static 门面——看来我要好好学习才是,而且 Slf4J 1.x 和 2.x 的方法又不同,2.x 的 好像是 SPI 去适配第三方日志库。

增加 ELK 日志输出

ELK 读取的日志为本地磁盘的一个 JSON 文件,我们只要配置好 JUL 的 Handler 和 Formatter 即可完成。

  • JsonHandler,保存 JSON 日志的处理器
  • JsonFormatter,日志格式转换到 JSON,源码如下。

在这里插入图片描述

相关文章:

  • 大模型的语言能力
  • 俄罗斯成为印度的第二大进口国,柯桥外贸俄语培训
  • 提升 Python 执行速度:Codon、C/C++、Rust、Numba(JIT)、Taichi、Nuitka、MatxScript
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • Java SPI机制
  • 【服务器学习】timer定时器模块
  • mac环境使用sudo进行node包管理
  • 矩阵的QR分解
  • sqli-labs关卡18(基于http头部报错盲注)通关思路
  • react 手机端 rc-table列隐藏(根据相关条件是否隐藏)、实现图片上传操作
  • 矩阵的模和内积
  • 基于金鹰算法优化概率神经网络PNN的分类预测 - 附代码
  • 量化交易:借助talib使用技术分析指标
  • Python字典六种类型概述
  • 和解电话(匿名电话)/情侣拉黑联系电话/虚拟号/虚拟中间号/拉黑联系项目代码
  • 【译】JS基础算法脚本:字符串结尾
  • .pyc 想到的一些问题
  • 【css3】浏览器内核及其兼容性
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • docker-consul
  • extjs4学习之配置
  • Java方法详解
  • Java面向对象及其三大特征
  • Python3爬取英雄联盟英雄皮肤大图
  • Swoft 源码剖析 - 代码自动更新机制
  • 工作手记之html2canvas使用概述
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 双管齐下,VMware的容器新战略
  • 跳前端坑前,先看看这个!!
  • 最近的计划
  • #WEB前端(HTML属性)
  • $.ajax中的eval及dataType
  • (11)MATLAB PCA+SVM 人脸识别
  • (JS基础)String 类型
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (二)fiber的基本认识
  • (附源码)ssm学生管理系统 毕业设计 141543
  • .NET单元测试
  • @RequestMapping处理请求异常
  • @开发者,一文搞懂什么是 C# 计时器!
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [20160902]rm -rf的惨案.txt
  • [ACM] hdu 1201 18岁生日
  • [EULAR文摘] 脊柱放射学持续进展是否显著影响关节功能
  • [Git 1]基本操作与协同开发
  • [GPT]Andrej Karpathy微软Build大会GPT演讲(上)--GPT如何训练
  • [LeetCode]Max Points on a Line
  • [linux] shell中的()和{}
  • [Linux]Ubuntu noVNC使用
  • [Linux]于Mac在配置Linuxserver安装Nginx+PHP
  • [Manacher]【学习笔记】
  • [NISACTF 2022]easyssrf
  • [nlp] 多语言大模型不同语种/语系数据的数据配比调节
  • [Oh My C++ Diary]用cout输出流保留输出小数位数的方法
  • [PHP]禅道项目管理软件ZenTaoPMS源码包 v16.4