轻量级 Java 日志组件

news2024/10/6 6:46:28

日志记录功能在开发中很常用,不仅可以记录程序运行的细节,方便调试,也可以记录用户的行为,是框架中不可或缺的组件。为最大程度复用现有的组件,我们就地取材使用了 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 {
    @Test
    public 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.coloradmin.cn/o/1223696.html

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

相关文章

Linux--初识和几个简单的指令(1)

目录 前言 0.什么是操作系统 0.1 搭建 Linux 环境 0.2搭建 Linux 环境小结 1.使用 XShell 远程登录 Linux 1.1关于 Linux 桌面 1.2下载安装 XShell 1.3查看 Linux 主机 ip 1.4XShell 下的复制粘贴 2.Linux下基本指令 2.1 pwd命令 2.2 ls命令 2.3 mkdir指令 2.4 cd…

Linux上编译和安装SOFA23.06

前言 你可以直接使用编译安装好的SOFA版本Installing from all-included binaries (v23.06.00)&#xff1a; 如果你想自己编译&#xff0c;可以看我下面写的内容&#xff0c;不过绝大多数是从官网来的&#xff0c;如果和官网有出入&#xff0c;建议还是以官网为准。 在Linux下…

josef约瑟 时间继电器 ST3PA-A AC220V 带插座PF085A

ST3P系列时间继电器适用于交流50Hz或60Hz,额定电压380V及以下或直流24V的控制电路中作廷时元件,按预定的时间接通或分断电路。具有体积小,精度高,延时范围宽,可与JSZ3系列继电器等同互换使用。 系列型号 ST3PF-2Z(JSZ3F-2Z) 5s AC110V ST3PF(JSZ3F) 10s AC48V ST3PC-1(AH3-3)…

IJ中配置TortoiseSVN插件:

文章目录 一、报错情况&#xff1a;二、配置TortoiseSVN插件&#xff1a; 一、报错情况&#xff1a; 由于公司电脑加密&#xff0c;TortoiseSVN菜单没有提交和更新按钮&#xff0c;所以需要使用IJ的SVN进行代码相关操作 二、配置TortoiseSVN插件&#xff1a; 需要设置一个svn.…

Go 之 captcha 生成图像验证码

目前 chptcha 好像只可以生成纯数字的图像验证码&#xff0c;不过对于普通简单应用来说也足够了。captcha默认将store封装到内部&#xff0c;未提供对外操作的接口&#xff0c;因此使用自己显式生成的store&#xff0c;可以通过store自定义要生成的验证码。 package mainimpor…

LINUX入门篇【6】----第一个LINUX小程序---进度条及相关知识讲解

前言&#xff1a; 本篇我们将开始尝试构建我们的第一个LINUX的小程序----进度条作为一个十分常见的程序&#xff0c;在我们之后的工程实践中也是需要多次运用&#xff0c;但是介于我们目前还没有去学习网络等方面的知识&#xff0c;没法独立的去利用程序去下载一个真正的程序&…

【Proteus仿真】【Arduino单片机】LM35温度计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶、LM35传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示传感器检测温度。 二、软件设计 /* 作者&a…

场景交互与场景漫游-路径漫游(7)

路径漫游 按照指定的路径进行漫游对一个演示是非常重要的。在osgViewer中&#xff0c;当第一次按下小写字母“z”时&#xff0c;开始记录动画路径;待动画录制完毕&#xff0c;按下大写字母“Z”&#xff0c;保存动画路径文件;使用osgViewer读取该动画路径文件时&#xff0c;会回…

Cadence virtuoso drc lvs pex 无法输入

问题描述&#xff1a;在PEX中的PEX options中 Ground node name 无法输入内容。 在save runset的时候也出现无法输入名称的情况 解决办法&#xff1a; copy一个.bashrc文件到自己的工作目录下 打开.bashrc文件 在.bashrc中加一行代码&#xff1a;unset XMODIFIERS 在终端sour…

java使用 TCP 的 Socket API 实现客户端服务器通信

一&#xff1a;什么是 Socket(套接字) Socket 套接字是由系统提供于网络通信的技术, 是基于 TCP/IP 协议的网络通信的基本操作&#xff0c;要进行网络通信, 需要有一个 socket 对象, 一个 socket 对象对应着一个 socket 文件, 这个文件在 网卡上而不是硬盘上, 所以有了 sokcet…

模块一、任务一.数据分析概述

一、module1 预测未来-总统大选 样本偏差 二、module2 优化现状-化妆品销售 1、数据分析师从业务类型上划分 2、目标&#xff1a;总销量 达到 目标销量 3、固定基本流程 &#xff08;1&#xff09;确定 一、目标值节节升高&#xff0c;是否合理&#xff1f;根据什么定的&…

【火炬之光-魔灵装备】

文章目录 装备天赋追忆石板技能魂烛刷图策略 装备 头部胸甲手套鞋子武器盾牌项链戒指腰带神格备注盾牌其余的装备要么是召唤物生命&#xff0c;要么是技能等级&#xff0c;鞋子的闪电技能等级加2不是核心&#xff0c;腰带的话主要是要冷却有冷却暗影的技能是不会断的&#xff…

“腾易视连”构建汽车生态新格局 星选计划赋能创作者价值提升

11月16日&#xff0c;在2023年广州国际车展前夕&#xff0c;以“腾易视连&#xff0c;入局视频号抓住增长新机会”为主题的腾易创作者大会在广州隆重举办。此次大会&#xff0c;邀请行业嘉宾、媒体伙伴、生态伙伴、视频号汽车领域原生达人等共济一堂&#xff0c;结合汽车行业数…

多聚焦图像融合算法

# @File : PerfectFusion.py # @Author : ShawnWang # @Desc : 多焦点图像融合 # Time : 2023/9/24 08:25 import cv2 import matplotlib.pyplot as plt import numpy as np import pywt from PIL import Image# 基于小波变换的多聚焦图像融…

视频怎么做成二维码?在线教学视频码的制作技巧

视频是怎么制作成二维码的呢&#xff1f;现在经常会发现扫描很多的二维码会观看视频内容的情况&#xff0c;这种方式简化视频传递的过程&#xff0c;能够更加简单快捷的在线获取视频内容。对于想要了解视频二维码制作方法的小伙伴&#xff0c;小编通过本篇文章来教大家一招&…

网站优化工具Google Optimize

Google Optimize 是一款由Google提供的网站优化工具。Google Optimize旨在帮助网站管理员通过对网页内容、设计和布局进行测试和优化&#xff0c;来提升用户体验和网站的转化率。 Google Optimize 提供了 A/B 测试和多变量测试功能&#xff0c;使网站管理员能够比较和评估不同…

【左程云算法全讲13】暴力递归

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于左程云算法课程进行的&#xff0c;每个知识点的修正和深入主要参考…

掌握PyQt6/Pyside6如何用QTreeView QFileSystemModel 展示指定目录结构

文章目录 📖 介绍 📖🏡 环境 🏡📄 源码📖 介绍 📖 有时候我们需要给用户展示一个指定目录下的所有文件树结构,这里使用 PyQt6/Pyside6的QTreeView就可以轻松实现,本文将与大家分享实现源码 🏡 环境 🏡 本文代码运行的环境如下 Windows11Python3.11.5PySide…

【bigo前端】egret中的对象池浅谈

本文首发于&#xff1a;https://github.com/bigo-frontend/blog/ 欢迎关注、转载。 egret是一款小游戏开发引擎&#xff0c;支持跨平台开发&#xff0c;之前使用这款引擎开发了一款捕鱼游戏&#xff0c;在这里简单聊下再egret中关于对象池的使用&#xff0c;虽然该引擎已经停止…