轻量级 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,源码如下。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/191019.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统 day11(进程调度时机、切换、调度方式、调度程序)

进程调度的时机 这里的主动放弃指的是—内中断&#xff08;异常、例外&#xff09;&#xff0c;中断信号来自CPU内部。而被动放弃指的是—外中断&#xff08;中断&#xff09;&#xff0c;中断信号来自CPU外部 如果该进程还没退出临界区&#xff08;还没解锁&#xff09;就进行…

轻量级的资源授权:基于 OAuth 规范

了解 OAuth 感觉 OAuth 太负盛名了&#xff0c;以至于后来在 OIDC 反而难以企及前辈 OAuth。倒是大家谈论比较多的是 JWT&#xff08;例如https://www.cnblogs.com/lyzg/p/6132801.html&#xff09;&#xff0c;——实际谈 JWT 就是在实现 OIDC&#xff0c;反而 OIDC 大家不怎…

搜索引擎ElasticSearch分布式搜索和分析引擎学习,SpringBoot整合ES个人心得

ElasticSearch Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java语言开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是一种流行的企业级搜索引擎。Elas…

HLS基础issue

hls 是一个用C/c 来开发PL &#xff0c;产生rtl的工具 hls是按照rtl code来运行的 &#xff0c; 但是rtl会在不同器件调用不同的源语&#xff1b; 可能产生的ip使用在vivado另外一个器件的话 会存在问题&#xff1b; Hls &#xff1a; vivado ip &#xff0c; vitis kernel 是…

装修干货|卧室常见3个软装搭配问题。福州中宅装饰,福州装修

引言 作为一名软装设计师&#xff0c;我对卧室的家具及软装布置颇有心得&#xff0c;现在就给你们带来卧室装修设计一些小技巧&#xff1a; 1. 床&#xff1b;衣柜&#xff1b;床头柜的摆放 床的摆放位置非常重要&#xff0c;一般要放在离窗户稍远的地方&#xff0c;避免直接…

QT绘图设备

pixmap绘图设备在磁盘上进行绘图 通过pix.save将图片保存到E盘下 不是主要的绘画设备&#xff0c;可以将绘图指令保存 然后在下边可以调用重现绘图指令

【脑与认知科学】【n-back游戏】

请参考课堂内容&#xff0c;设计一种测试工作记忆的实验方法&#xff0c;并选择三位同学作为被试测试工作记忆。请画出实验流程图&#xff0c;叙述实验测试目标&#xff0c;并分析实验结果。 举例&#xff1a;一般我们选择n_back来测试对数字或字母的记忆&#xff0c;选择色块实…

Web(5)Burpsuite之文件上传漏洞

1.搭建网站&#xff1a;为网站设置没有用过的端口号 2.中国蚁剑软件的使用 通过一句话木马获得权限 3.形象的比喻&#xff08;风筝&#xff09; 4.实验操作 参考文章&#xff1a; 文件上传之黑名单绕过_文件上传黑名单绕过_pigzlfa的博客-CSDN博客 后端验证特性 与 Window…

【数据结构】栈与队列面试题(C语言)

我们再用C语言做题时&#xff0c;是比较不方便的&#xff0c;因此我们在用到数据结构中的某些时只能手搓或者Ctrlcv 我们这里用到的栈或队列来自栈与队列的实现 有效的括号 有效的括号&#xff0c;链接奉上。 解题思路&#xff1a; 先说结论&#xff1a; 因为我们是在讲栈与…

SpringCloud 之Feign的性能优化

Feign底层默认是JDK自带的HttpURLConnection&#xff0c;它是单线程发送HTTP请求的&#xff0c;不能配置线程池&#xff0c;我们使用Okhttp或者HttpClien 朵发送http请求&#xff0c;并且它们两个都支持线程池。 常见HTTP客户端 HttpClient HttpClient 是 Apache Jakarta Comm…

SELinux

目录 1.概述 1.1.概念 1.2.作用 1.3. SELinux与传统的权限区别 2. SELinux工作原理 2.1.名词解释 2.1.1.主体(Subject) 2.1.2.目标(Object) 2.1.3.策略(Policy) 2.1.4.安全上下文(Security Context) 2.2.文件安全.上下文查看 2.2.1.命令: 2.2.2.分析 3. **SELinu…

python3:turtle绘图 .2023-11-18

绘制一个菱形:四边相等且都为200像素;四个内角两边各为60度,上下各为120度 import turtle #导入turtle #画笔默认绘制方向为水平向右 turtle.right(-30) #画笔绘制方向向左(逆时针)旋转30度. turtle.fd(200) #画笔沿绘制方向绘制200像素长度 turtle.right(60) #画笔绘制方向在…