解锁新技能《基于logback的纯java版本SDK实现》
开源SDK:
<!--Java通用日志组件SDK-->
<dependency><groupId>io.github.mingyang66</groupId><artifactId>oceansky-logger</artifactId><version>4.3.6</version>
</dependency>
<!-- Java基于logback的日志组件SDK -->
<dependency><groupId>io.github.mingyang66</groupId><artifactId>emily-spring-boot-logger</artifactId><version>4.3.6</version>
</dependency>
在项目开发过程中通常会使用logback作为日志记录的依赖工具,使用方式是引入logback相关jar包,然后配置logback.xml配置文件的方式来实现;xml的配置方案如果是一个两个项目还好,那如果是几十个项目呢?每个项目都要写一遍配置文件也是一键很繁琐的事情,而且配置文件还容易出错,那我们有没有办法将其改造成一个纯java版本的SDK组件呢?如果我们需要用的时候只需要将其依赖引入项目中开箱即用是不是很方便。
一、开源SDK项目规划
- 新建oceansky-logger sdk,不依赖任何三方组件,不依赖任何web容器;
- 新建emily-spring-boot-logger sdk,为基于springboot的项目提供开箱即用的starter;
二、oceansky-logger基础库SDK支持哪些功能
- 支持基础日志打印;
private static final Logger baseLogger = LoggerFactory.getLogger(LogbackController.class);
baseLogger.error("--------error");
baseLogger.info("--------info");
baseLogger.debug("--------debug");
baseLogger.warn("--------warn");
baseLogger.trace("--------trace");
这些日志会打印到指定的日志文件夹,分别存储到error、warn、info、debug文件夹下;
- 支持分组日志打印;
private static final Logger logger = LoggerFactory.getGroupLogger(LogbackController.class, "group/test");
groupLogger.error("+++++++++++==ttttttttttttt");
groupLogger.debug("+++++++++++==ttttttttttttt");
groupLogger.info("+++++++++++==ttttttttttttt");
groupLogger.warn("+++++++++++==ttttttttttttt");
groupLogger.trace("+++++++++++==ttttttttttttt");
这些日志会分别打印到指定的分组文件夹group/test下面,分别存储到error、warn、info、debug文件夹下;
- 支持模块日志打印;
private static final Logger logger = LoggerFactory.getModuleLogger(LogbackController.class, "test1", "tt0");
logger..info("ni-----------------" + System.currentTimeMillis());
这些日志分别被记录到指定的文件夹及指定的文件名中,同一个项目中可以指定N多个这样的日志记录模块;
- 支持是否将上述三种日志展示到控制台上,控制统一通过LoggerContextInitializer.init方法实现;
- console控制台支持基于ANSI编码的颜色高亮展示;
- 异常堆栈允许展示每一行末尾追加对应所属的jar包,如下示例的中括号内:
2023-07-19 14:16:38.405 ERROR default --- [tp-nio-8080-exec-1] c.e.i.t.controller.LogbackController:35 : -----error test----
java.lang.NullPointerException: Cannot invoke "String.length()" because "s" is nullat com.emily.infrastructure.test.controller.LogbackController.debug(LogbackController.java:33) ~[classes/:na]at com.emily.infrastructure.test.controller.LogbackController$$FastClassBySpringCGLIB$$2de19373.invoke(<generated>) ~[classes/:na]at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.28.jar:5.3.28]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.28.jar:5.3.28]at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.28.jar:5.3.28]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.28.jar:5.3.28]at com.alibaba.druid.support.spring.stat.DruidStatInterceptor.invoke(DruidStatInterceptor.java:70) ~[druid-1.2.18.jar:na]at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.28.jar:5.3.28]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.28.jar:5.3.28]
-
支持日志debug模式,展示内部状态信息及调试信息;
-
支持基于ZIP、GZ的归档日志压缩,压缩率在80%以上;
-
允许重复初始化logger,多次初始化以最后一次为准(每次初始化都会重置原来的初始化内容)
LoggerContextInitializer.init(new LoggerProperties())
三、emis-spring-boot-logger基础库SDK支持哪些功能
- 完全基于oceansky-logger sdk组件为springboot提供的starter组件;
- 提供基于自动化配置的开箱即用的组件模式,只需在pom.xml引入starter既可以按照ocean-logger中指定的使用方案使用;
- 自动化配置属性控制root、group、module、appender、滚动策略等,具体配置如下:
#日志组件
#启动日志访问组件,默认:true
spring.emily.logger.enabled=true
#是否开启debug模式,默认:false
spring.emily.logger.debug=true
#发生异常打印异常堆栈时是否将包信息追加到每行末尾,默认:true
spring.emily.logger.packaging-data=true
#日志文件存放路径,默认是:./logs
spring.emily.logger.appender.path=./logs
#如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true
spring.emily.logger.appender.append=true
#如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false|Support multiple-JVM writing to the same log file
spring.emily.logger.appender.prudent=false
#设置是否将输出流刷新,确保日志信息不丢失,默认:true
spring.emily.logger.appender.immediate-flush=true
#是否开启基于文件大小和时间的SizeAndTimeBasedRollingPolicy归档策略
#归档策略(SIZE_AND_TIME_BASED、TIME_BASE),默认:TIME_BASE
spring.emily.logger.appender.rolling-policy.type=TIME_BASE
#设置要保留的最大存档文件数量,以异步方式删除旧文件,默认 7
spring.emily.logger.appender.rolling-policy.max-history=2
#最大日志文件大小 KB、MB、GB,默认:500MB
spring.emily.logger.appender.rolling-policy.max-file-size=10KB
#控制所有归档文件总大小 KB、MB、GB,默认:5GB
spring.emily.logger.appender.rolling-policy.total-size-cap=5GB
#设置重启服务后是否清除历史日志文件,默认:false
spring.emily.logger.appender.rolling-policy.clean-history-on-start=true
#压缩模式(NONE、GZ、ZIP),默认:ZIP
spring.emily.logger.appender.rolling-policy.compression-mode=ZIP
#是否开启异步记录Appender,默认:false
spring.emily.logger.appender.async.enabled=false
#队列的最大容量,默认为 256
spring.emily.logger.appender.async.queue-size=256
#默认,当队列还剩余 20% 的容量时,会丢弃级别为 TRACE, DEBUG 与 INFO 的日志,仅仅只保留 WARN 与 ERROR 级别的日志。想要保留所有的事件,可以设置为 0
spring.emily.logger.appender.async.discarding-threshold=0
# 根据所引用 appender 队列的深度以及延迟, AsyncAppender 可能会耗费长时间去刷新队列。
# 当 LoggerContext 被停止时, AsyncAppender stop 方法会等待工作线程指定的时间来完成。
# 使用 maxFlushTime 来指定最大的刷新时间,单位为毫秒。在指定时间内没有被处理完的事件将会被丢弃。这个属性的值的含义与 Thread.join(long)) 相同
# 默认是 1000毫秒
spring.emily.logger.appender.async.max-flush-time=1000
# 在队列满的时候 appender 会阻塞而不是丢弃信息。设置为 true,appender 不会阻塞你的应用而会将消息丢弃,默认为 false
spring.emily.logger.appender.async.never-block=false
#是否将日志信息输出到控制台,默认:true
spring.emily.logger.root.console=false
#基础日志文件路径,默认:""
spring.emily.logger.root.file-path=base
#日志级别,即该等级之上才会输出,ERROR > WARN > INFO > DEBUG > TRACE >ALL, 默认:INFO
spring.emily.logger.root.level=info
#记入文件日志格式-不带颜色
spring.emily.logger.root.pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %cn --- [%18.18thread] %-36.36logger{36}:%-4.4line : %msg %n
#控制台输出格式-带颜色,默认:[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] [%-36.36logger{36}:%-4.4line] : %msg%n
spring.emily.logger.root.console-pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %cn --- [%18.18thread] %cyan(%-36.36logger{36}:%-4.4line) : %msg %n
#是否将模块日志输出到控制台,默认:false
spring.emily.logger.group.console=true
#日志级别,即该等级之上才会输出,ERROR > WARN > INFO > DEBUG > TRACE >ALL, 默认:INFO
spring.emily.logger.group.level=info
#模块日志输出格式,默认:%msg%n
spring.emily.logger.group.pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %cn --- [%18.18thread] %-36.36logger{36}:%-4.4line : %msg %n
#是否将模块日志输出到控制台,默认:false
spring.emily.logger.module.console=true
#日志级别,即该等级之上才会输出,ERROR > WARN > INFO > DEBUG > TRACE >ALL, 默认:DEBUG
spring.emily.logger.module.level=info
#模块日志输出格式,默认:%msg%n
spring.emily.logger.module.pattern=%msg%n
四、组件使用方法
- oceansky-logger组件SDK使用方法,调用初始化方法后即可开始日志记录的愉快旅程
LoggerProperties properties = new LoggerProperties();
LoggerContextInitializer.init(properties);
- emily-spring-boot-logger是一个基于springboot自动化配置,开箱即用的组件,只需要引入组件既可以使用;
如果对源码感兴趣,可以查看GitHub源码:https://github.com/mingyang66/spring-parent
相关文章:
解锁新技能《基于logback的纯java版本SDK实现》
开源SDK: <!--Java通用日志组件SDK--> <dependency><groupId>io.github.mingyang66</groupId><artifactId>oceansky-logger</artifactId><version>4.3.6</version> </dependency> <!-- Java基于logback的…...
你需要知道的云原生架构体系内容
云原生(Cloud-Native)的概念在国内提及的越来越多,但大部分人对云原生的认识仅限于容器、微服务、DevOps等内容,把容器、微服务、 DevOps就等同于云原生,这显然是不对的。CNCF从其自身的角度定义了云原生技术ÿ…...
安全渗透--正则表达式
什么是正则表达式? 正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。 一个正则表达式是一种从左到右匹配主体字符串的模式。 “Regular expression”这个词比较拗口,我们常使用缩写的术语“regex…...
git如何撤销commit(未push)
文章目录 前言undo commitreset current branch to here Undo Commit,Revert Commit,Drop Commit的区别 是否删除对代码的修改是否删除Commit记录是否会新增Commit记录Undo Commit不会未Push会,已Push不会不会Revert Commit会不会会Drop Com…...
Vue数组与字符串互转
一、数组转换成字符串的方法 join() var arr [A, B, C]; var str arr.join(、); console.log(str); // 输出 A、B、C toString() var arr [A, B, C]; var str arr.toString(); console.log(str); // 输出 A, B, C JSON.stringify() var arr [A, B, C]; var str JSO…...
Java编程实现遍历两个MAC地址之间所有MAC的方法
Java编程实现遍历两个MAC地址之间所有MAC的方法 本文实例讲述了java编程实现遍历两个MAC地址之间所有MAC的方法。分享给大家供大http://家参考,具体如下: 在对发放的设备进行后台管理时,很多时候会用到设备MAC这个字段,它可以标识唯一一个设备。然而在数…...
用AXIS2发布WebService的方法
Axis2+tomcat6.0 实现webService 服务端发布与客户端的调用。 Aixs2开发webService的方法有很多,在此只介绍一种比较简单的实现方法。 第一步:首先要下载开发所需要的jar包 下载:axis2-1.6.1-war.zip http://www.apache.org/dist//axis/axis2/java/core/1.6.1/ 下载…...
嵌入式学习_Day 003
程序功能介绍 c #include <stdio.h> int main() {char c,ll;printf("please enter a capital letter:");cgetchar();getchar();if (c>A&& c<Z) {llc32;printf("Lowercase letter output:%c\n",ll);printf("ASCII value:%d\n"…...
常用的数据结构 JAVA
目录 1、线性表2、栈:3、队列: 1、线性表 List<Object> narnat new ArrayList<>();ArrayList:动态数组 1、可以嵌套使用 2、add(x)添加元素x,remove(index)删除某个位置的元素 3、注意list是指向性的,…...
基于机器视觉工具箱和形态学处理的视频中目标形状检测算法matlab仿真
目录 1.算法理论概述 2.部分核心程序 3.算法运行软件版本 4.算法运行效果图预览 5.算法完整程序工程 1.算法理论概述 目标形状检测是计算机视觉领域的重要任务之一,旨在从视频序列中自动检测和识别特定目标的形状。本文介绍一种基于机器视觉工具箱和形态学处理…...
小白入门:sentence-transformer 提取embedding模型转onnx
文章目录 序言原理讲解哪些部分可转onnx 代码区0. 安装依赖1. 路径配置2. 测试数据3. 准备工作3.1迁移保存目标文件 4. model转onnx-gpu5. 测试一下是否出错以及速度5.1 测试速度是否OK5.2测试结果是否OK 6. tar 这些文件 序言 本文适合小白入门,以自己训练的句子e…...
数据库应用:Redis持久化
目录 一、理论 1.Redis 高可用 2.Redis持久化 3.RDB持久化 4.AOF持久化(支持秒级写入) 5.RDB和AOF的优缺点 6.RDB和AOF对比 7.Redis性能管理 8.Redis的优化 二、实验 1.RDB持久化 2.AOF持久化 3.Redis性能管理 4.Redis的优化 三、总结 一、…...
js版计算比亚迪行驶里程连续12个月计算不超3万公里改进版带echar
<!DOCTYPE html> <html lang"zh-CN" style"height: 100%"> <head> <meta charset"utf-8" /> <title>连续12个月不超3万公里计算LIGUANGHUA</title> <style> .clocks { …...
一文详解Spring Bean循环依赖
一、背景 有好几次线上发布老应用时,遭遇代码启动报错,具体错误如下: Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name xxxManageFacadeImpl: Bean with name xxxManageFa…...
基于PHP+ vue2 + element +mysql自主研发的医院不良事件上报系统
医院不良事件上报管理系统源码 不良事件上报是为了响应卫生部下发的等级医院评审细则中第三章第9条规定:医院要有主动报告医疗安全(不良)事件的制度与工作流程。由医疗机构医院或医疗机构报告医疗安全不良事件信息,利用报告进行研…...
微服务远程调用openFeign简单回顾(内附源码示例)
目录 一. OpenFeign简介 二. OpenFeign原理 演示使用 provider模块 消费者模块 配置全局feign日志 示例源代码: 一. OpenFeign简介 OpenFeign是SpringCloud服务调用中间件,可以帮助代理服务API接口。并且可以解析SpringMVC的RequestMapping注解下的接口&#x…...
【云计算小知识】云环境是什么意思?有什么优点?
随着云计算的快速发展,了解云计算相关知识也是运维人员必备的。那你知道云环境是什么意思?有什么优点?云环境安全威胁有哪些?如何保证云环境的运维安全?这里我们就来简单聊聊。 云环境是什么意思? 云环境是…...
【搜索引擎Solr】Apache Solr 神经搜索
Sease[1] 与 Alessandro Benedetti(Apache Lucene/Solr PMC 成员和提交者)和 Elia Porciani(Sease 研发软件工程师)共同为开源社区贡献了 Apache Solr 中神经搜索的第一个里程碑。 它依赖于 Apache Lucene 实现 [2] 进行 K-最近邻…...
PostgreSQL 设置时区,时间/日期函数汇总
文章目录 前言查看时区修改时区时间/日期操作符和函数时间/日期操作符日期/时间函数:extract,date_part函数支持的field 数据类型格式化函数用于日期/时间格式化的模式: 扩展 前言 本文基于 PostgreSQL 12.6 版本,不同版本的函数…...
性能测试Ⅱ(压力测试与负载测试详解)
协议 性能理论:并发编程 ,系统调度,调度算法 监控 压力测试与负载测试的区别是什么? 负载测试 在被测系统上持续不断的增加压力,直到性能指标(响应时间等)超过预定指标或者某种资源(CPU&内存)使用已达到饱和状…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
