轻量级 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.mzph.cn/news/147441.shtml

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

相关文章

Mybatis Plus公共字段自动填充

在多张表中同时存在创建时间、创建人、修改时间、修改人等字段&#xff0c;这些基础字段属于公共字段&#xff0c;那能不能对于这些公共字段在某个地方统一进行处理&#xff0c;从而简化开发&#xff0c;针对这个场景&#xff0c;就可以采用Mybatis Plus提供的公共字段自动填充…

聚观早报 |联想集团Q2财季业绩;小鹏汽车Q3营收

【聚观365】11月17日消息 联想集团Q2财季业绩 小鹏汽车Q3营收 微软发布两款自研AI芯片 FAA批准SpaceX再次发射星际飞船 2023 OPPO开发者大会 联想集团Q2财季业绩 全球数字经济领导企业联想集团公布截至2023年9月30日的2023/24财年第二财季业绩&#xff1a;整体营收达到10…

微信小程序H5 uniapp

最近微信小程序对有视频播放的审核严&#xff0c;需要提供“文娱类资质”。而申请这个资质比较繁琐。所以我们在小程序上用web-view做跳转到H5&#xff0c;H5使用uniapp编写。这是小程序关于web-view文档说明。https://developers.weixin.qq.com/miniprogram/dev/component/web…

硬件工程师基础能力课

第一课时--基本定理、电阻、电容等 首先了解下面几个概念&#xff0c;基尔霍夫定理&#xff1a;KCL & KVL&#xff0c;叠加定理&#xff0c;戴维南定理&#xff08;电压源等效&#xff09;和诺顿定理&#xff08;电流源等效&#xff09;、奈奎斯特采样定理。 上面说的这些东…

vue的生命周期分别是什么?

Vue的生命周期分为8个阶段&#xff0c;分别是&#xff1a; beforeCreate&#xff1a;实例初始化之后&#xff0c;数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 created&#xff1a;实例已经创建完成后被调用&#xff0c;这时候实例已完成以下的配置&#…

asp.net core EF Sqlserver

一、EF CORE的使用 1、使用NuGet来安装EF CORE 使用程序包管理器控制台&#xff0c;进行命令安装 //安装 Microsoft.EntityFrameworkCoreInstall-Package Microsoft.EntityFrameworkCore //安装 Microsoft.EntityFrameworkCore.SqlServer Install-Package Microsoft.EntityF…

Uniapp有奖猜歌游戏系统源码 带流量主

有奖猜歌游戏是一款基于uni-app、uniCloud、uniAD 开发的小游戏,通过猜歌曲、观看广告赚取现金奖励。 本游戏基本特征如下: 1、玩家可以通过猜歌、做任务等方式直接获取现金奖励 2、玩家可以通过猜歌、拆红包、做任务等方式获取金币奖励,当金币累积到一定数量可以兑换现金 3…

产品运营的场景和运营策略

一、启动屏 1&#xff0e;概念 启动屏&#xff0c;特指 APP 产品启动时即显示的界面&#xff0c;这个界面一般会停留几秒钟时间&#xff0c;在这个时间内 APP 会在后台加载服务框架、启动各种服务 SDK 、获取用户地理位置、判断有无新版本、判断用户账户状态以及其他系统级别的…

微机原理_12

一、单项选择题(本大题共15小题,每小题3分&#xff0c;共45分。在每小题给出的四个备选项中&#xff0c;选出一个正确的答案。〕 十进制正数56的 8位二进制补码是()。 A. 00011001 B. 10100110 C. 10011001 D. 00100110 若栈顶的物理地址为20100H&#xff0c;当执行完指令PUSH…

qt 重载信号,使用““方式进行connect()调用解决方案

问题 在Qt中&#xff0c;重载的信号默认是无法使用&这种方式调用的。 因为&只能绑定到一个具体的信号&#xff0c;而重载的信号名称相同&#xff0c;编译器无法确定要绑定哪一个信号。 解决方案 如果非要使用&绑定重载的信号&#xff0c;可以使用函数指针进行转…

2023年道路运输企业主要负责人证考试题库及道路运输企业主要负责人试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年道路运输企业主要负责人证考试题库及道路运输企业主要负责人试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人…

2023-11-18

早上把 kernel pwn 相关的总结的差不多了. 然后下午主要就学习了一下 ebpf 相关的知识, 晚上然后复现了两道 pwn 题. 一天就这样过去了...... 明日计划: 早上做一道 qemu 逃逸题目, 然后肝作业

基于SpringBoot的SSMP整合案例(消息一致性处理与表现层开发)

消息一致性处理 在后端执行完相应的操作后&#xff0c;我们需要将执行操作后的结果与数据返回前端&#xff0c;前端 调用我们传回去的数据&#xff0c;前端是如何知道我们传回去的数据名称的&#xff1f; 答&#xff1a;前后端遵循了同一个"协议"。这个协议就是定义…

【STM32】CRC(循环冗余校验)

一、CRC的背景知识 1、什么是CRC (1)CRC&#xff08;Cyclic Redundancy Check&#xff09;&#xff0c;循环冗余校验 (2)什么是校验&#xff0c;为什么需要校验&#xff1a;数据传输&#xff0c;数据存储过程中需要使用到的 (3)什么是冗余&#xff1a;表示比实际上要传输的数据…

docker 安装mongodb 实现 数据,日志,配置文件外挂

docker 安装mongodb 实现数据&#xff0c;日志&#xff0c;配置文件外挂 1 背景 最近开发了一个评论系统之前用mysql来存储数据&#xff0c;但是考虑到后期业务增大访问量也会增大&#xff0c;为了兼容这种高并发的场景&#xff0c;因此经过多方面的考虑&#xff0c;我们最终…

C语言--每日五道练习题--Day18

第一题 1.设a为整型变量&#xff0c;不能正确表达数学关系&#xff1a;10<a<15的C语言表达式是&#xff08;&#xff09; A&#xff1a;10<a<15 B&#xff1a;a11|| a12 || a13 || a14 C&#xff1a;a>10 && a<15 D&#xff1a;!(a<10) &&…

2023年咸阳市《网络建设与运维》赛题解析------四、安全配置

安全配置 说明:IP地址按照题目给定的顺序用“ip/mask”表示,IPv4 any地址用0.0.0.0/0,IPv6 any地址用::/0,禁止用地址条目,否则按零分处理。 1.FW1配置IPv4 nat,实现集团产品1段IPv4访问Internet IPv4,转换ip/mask为200.200.200.16/28,保证每一个源IP产生的所有会话将…

Spring+Mybatis整合

整合代码 源码执行流程

Java拼图游戏

运行出的游戏界面如下&#xff1a; 按住A不松开&#xff0c;显示完整图片&#xff1b;松开A显示随机打乱的图片。 User类 package domain;/*** ClassName: User* Author: Kox* Data: 2023/2/2* Sketch:*/ public class User {private String username;private String password…

超详细 | 萤火虫算法原理及其实现(Matlab)

群智能(Swarm Intelligence&#xff0c;SI)是一类分散自组织系统的集体智能行为的总称&#xff0c;该表述最早在1989年由Gerardo Beni在分子自动机系统中提出。SI系统可视作一组简单的个体&#xff0c;其个体与个体、个体与环境之间存在交互作用&#xff0c;最终表征出智能行为…