Java自动日志监控框架auto-log详解

  • 1. 需求概述
  • 2. auto-log简介
    • 2.1 auto-log定义
    • 2.2 auto-log目的
    • 2.3 auto-log特性
    • 2.4 注解说明
    • 2.5 自定义拦截器
    • 2.6 自定义过滤器
    • 2.7 注意事项
    • 2.8 开源地址
  • 3.实现验证
    • 3.1 引入依赖
    • 3.2 代码实现
    • 3.3 处理结果

1. 需求概述

日常开发中,不管是单体还是分布式微服务,服务监控是必不可少的环节,没有监控的应用是很可怕的,你不知道应用服务处于什么状态,有什么风险,什么时候会宕掉。服务监控除了一些大型的监控工具,比如ELK,Zabbx,Prometheus,Arthas等工具外,本文要讲的是轻量级的日志监控工具,轻量到可以不引入Spring,就是一个简单的请求前后出入参以及异常的打印,以及自定义一些过滤器拦截器,traceID等功能,而不必每个服务的每个方法都手动处理。

实现本身也很简单,只需要通过切面+注解实现,github上发现auto-log无论是从架构设计,到实现,规范,注释,包括使用方式都值得推荐,感谢大佬,这里只做引荐,简单梳理使用验证。

2. auto-log简介

2.1 auto-log定义

auto-log 是一款为 java 设计的自动日志监控框架。

2.2 auto-log目的

经常会写一些工具,有时候手动加一些日志很麻烦,引入 spring 又过于大材小用。
所以希望从从简到繁实现一个工具,便于平时使用。

2.3 auto-log特性

  • 基于注解+字节码,配置灵活
  • 自动适配常见的日志框架
  • 支持编程式的调用
  • 支持注解式,完美整合 spring
  • 支持整合 spring-boot
  • 支持慢日志阈值指定,耗时,入参,出参,异常信息等常见属性指定
  • 支持 traceId 特性
  • 支持类级别定义注解
  • 支持自定义拦截器和过滤器

2.4 注解说明

@AutoLog
核心注解 @AutoLog 的属性说明如下:
@TraceId
@TraceId 放在需要设置 traceId 的方法上,比如 Controller 层,mq 的消费者,rpc 请求的接受者等。

属性 类型 默认值 说明
id Class 默认为 uuid traceId 的实现策略
putIfAbsent boolean false 是否在当前线程没有值的时候才设置值
enable boolean true 是否启用
interceptor Class[] 默认实现 拦截器实现,支持指定多个和自定义

2.5 自定义拦截器

内置拦截器
AutoLogInterceptor 默认实现。

自定义拦截器
1.直接继承自 AbstractAutoLogInterceptor 类,并且实现对应的方法即可。
2.使用的时候指定自定义拦截器。
@AutoLog(interceptor = MyAutoLogInterceptor.class)

2.6 自定义过滤器

内置过滤器
WebParamFilter 主要用于过滤 HttpRequest HttpServlet 等无法直接 JSON 序列化的对象。

自定义过滤器
1.直接继承 AbstractParamFilter 类实现对应的方法即可。
2.使用的时候指定自定义过滤器。
@AutoLog(paramFilter = MyParamFilter.class)

2.7 注意事项

1.auto-log默认是开启的@EnableAutoLog,无需再次开启,多次开启也不影响使用。
2.集成springboot只需要引入stater即可,无需任何配置。

2.8 开源地址

Github: https://github.com/houbb/auto-log
Gitee: https://gitee.com/houbinbin/auto-log

3.实现验证

3.1 引入依赖

<!--autolog--><dependency><groupId>com.github.houbb</groupId><artifactId>auto-log-springboot-starter</artifactId><version>0.0.15</version></dependency>

只需要引入 jar 即可,其他的什么都不用配置。
使用方式和 spring 一致。

3.2 代码实现

LogController

package com.zrj.autolog.controller;import com.github.houbb.auto.log.annotation.AutoLog;
import com.github.houbb.auto.log.annotation.TraceId;
import com.zrj.autolog.entity.Log;
import com.zrj.autolog.entity.Response;
import com.zrj.autolog.filter.MyLogParamFilter;
import com.zrj.autolog.interceptor.MyLogInterceptor;
import com.zrj.autolog.service.LogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;/*** 用户控制类** @author zrj* @since 2021-06-21 16:44:24*/
@Slf4j
@RestController
@RequestMapping("/log")
@Api(tags = "日志管理", description = "日志管理")
public class LogController {@Resourceprivate LogService logService;/*** 测试接口* 自定义过滤器,拦截器*/@TraceId@GetMapping("/test")@ApiOperation(value = "测试接口")@AutoLog(description = "测试接口", costTime = true, interceptor = MyLogInterceptor.class, paramFilter = MyLogParamFilter.class)public Response<String> test() {return Response.success("日志管理测试成功", null);}/*** 自动日志管理*/@TraceId@AutoLog(description = "自动日志管理", costTime = true)@PostMapping("/autolog")@ApiOperation(value = "自动日志管理测试")public Response<Log> autolog(@RequestBody Log log) {Log build = logService.getLog();if (build != null) {return Response.success("查询成功", build);}return Response.fail("查询失败");}}

MyLogParamFilter

package com.zrj.autolog.filter;import com.github.houbb.auto.log.core.support.filter.param.AbstractParamFilter;/*** 自定义入参过滤器(paramFilter)** @author zrj* @since 2021/11/10**/
public class MyLogParamFilter extends AbstractParamFilter {/*** 执行参数过滤** @param params 入参* @return 结果* @since 0.0.12*/@Overrideprotected Object[] doFilter(Object[] params) {Object[] newParams = new Object[1];newParams[0] = "自定义过滤器设置我我想要的值";return newParams;}
}

MyLogInterceptor

package com.zrj.autolog.interceptor;import com.github.houbb.auto.log.annotation.AutoLog;
import com.github.houbb.auto.log.api.IAutoLogInterceptorContext;
import com.github.houbb.auto.log.core.support.interceptor.autolog.AbstractAutoLogInterceptor;
import lombok.extern.slf4j.Slf4j;import java.util.Arrays;/*** 自定义日志拦截器(interceptor)** @author zrj* @since 2021/11/10**/
@Slf4j
public class MyLogInterceptor extends AbstractAutoLogInterceptor {/*** 方法执行以前* @param autoLog 注解* @param context 上下文* @since 0.0.10*/@Overrideprotected void doBefore(AutoLog autoLog, IAutoLogInterceptorContext context) {log.info("我的自定义入参:" + Arrays.toString(context.filterParams()));}/*** 方法执行以后* @param autoLog 注解* @param result  方法执行结果* @param context 上下文* @since 0.0.10*/@Overrideprotected void doAfter(AutoLog autoLog, Object result, IAutoLogInterceptorContext context) {log.info("我的自定义出参:" + result);}/*** 异常处理* @param autoLog   注解* @param exception 异常信息* @param context   上下文* @since 0.0.10*/@Overrideprotected void doException(AutoLog autoLog, Exception exception, IAutoLogInterceptorContext context) {log.info("我的自定义异常:");exception.printStackTrace();}
}

3.3 处理结果

MyLogInterceptor       : 我的自定义入参:[自定义过滤器设置我我想要的值]
MyLogInterceptor       : 我的自定义出参:Response(message=日志管理测试成功, data=null, code=200)
AutoLogInterceptor     : [f4794449d6454e13807fdd5a5fffc2dd] <自动日志管理>入参: [{"des":"日志描述","level":"日志级别","name":"日志名称","id":"日志ID"}].
e.impl.LogServiceImpl  : 这里保存日志信息
AutoLogInterceptor     : [f4794449d6454e13807fdd5a5fffc2dd] <自动日志管理>出参:{"code":"200","data":{"des":"测试啦","id":"20211109001","level":"info","name":"自动日志"},"message":"查询成功"}.
AutoLogInterceptor     : [f4794449d6454e13807fdd5a5fffc2dd] <自动日志管理>耗时:70ms.

Java自动日志监控框架auto-log详解相关推荐

  1. java ee ssh三大框架知识点_详解JAVAEE——SSH三大框架整合(spring+struts2+hibernate)...

    详解JAVAEE--SSH三大框架整合(spring+struts2+hibernate) 发布时间:2020-09-17 13:34:05 来源:脚本之家 阅读:64 作者:kent鹏 一.整合原理 ...

  2. java retry_Spring异常重试框架Spring Retry详解

    Spring Retry支持集成到Spring或者Spring Boot项目中,而它支持AOP的切面注入写法,所以在引入时必须引入aspectjweaver.jar包. 快速集成的代码样例: @Con ...

  3. Java自动化用例管理利器-TestNG详解

    TestNG是开源自动化测试工具,覆盖多类型测试:单元测试,功能测试,集成测试,它的功能非常强大 支持多种类型的单元测试(异常测试, 超时测试,依赖测试-.) 支持参数化 & 提供了丰富的测试 ...

  4. Java生产环境下性能监控与调优详解 大纲 学习感悟

    Java生产环境下性能监控与调优详解 生产环境发生了内存溢出如何处理? 生产环境应该给服务器分配多少内存合适? 如何对垃圾收集器的性能进行调优? 4.生产环境CPU负载飙高该如何处理? 5.生产环境应 ...

  5. java集合框架的结构_集合框架(Collections Framework)详解及代码示例

    简介 集合和数组的区别: 数组存储基础数据类型,且每一个数组都只能存储一种数据类型的数据,空间不可变. 集合存储对象,一个集合中可以存储多种类型的对象.空间可变. 严格地说,集合是存储对象的引用,每个 ...

  6. Spring Boot + ELK搭建日志监控框架

    Spring Boot + ELK搭建日志监控框架 准备ELK三件套 ​ Elasticsearch+Logstash+Kibana ​ 下载地址:https://www.elastic.co/cn/ ...

  7. Java生产环境下性能监控与调优详解 第2章 基于JDK命令行工具的监控

    Java生产环境下性能监控与调优详解 第2章 基于JDK命令行工具的监控 2-1 JVM的参数类型 标准参数 x参数 XX参数 2-2 查看JVM运行时参数 2-3 jstat查看JVM统计信息 2- ...

  8. java reflections_Java反射框架Reflections示例详解

    MAVEN 坐标 org.reflections reflections 0.9.10 Reflections 的作用 Reflections通过扫描classpath,索引元数据,并且允许在运行时查 ...

  9. spring框架 AOP核心详解

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

最新文章

  1. 王兴:互联网化是企业家最大的机会
  2. 菜鸟学前端之遍寻名师之混乱的笔记
  3. 使用Tomcat Native提升Tomcat IO效率
  4. javax.jdo.option.ConnectionURL配置的问题
  5. 开发者福音!面向Web场景的云开发服务正式开放!
  6. C语言实现控制台中光标随意移动
  7. 马哥学习李洋个人笔记之-----正则表达式
  8. paip.c#.net托盘图标的建立使用总结
  9. python办公ppt_最全总结 | 聊聊 Python 办公自动化之 PPT(中)
  10. C#中Panel控件的使用
  11. sim868 c++二次开发基本完成
  12. arduino tft 方向_在Arduino上使用1.8英寸TFT显示屏的入门指南
  13. 破解ISAPI_Rewrite3.1以及相关知识
  14. UVM中的TLM机制
  15. 人工智能技术会代替人类的工作吗
  16. 【阿克曼小车导出URDF模型教程】
  17. 调整el-table的行高(单元格高度)及单元格字体大小
  18. 使用Nero 8刻录CentOS启动盘
  19. 微信小程序我在校园打卡微信小程序设计与实现(含论文)
  20. Dockerfile 简单例子

热门文章

  1. cf #829 Div.2(A~D)
  2. DataGrip 2020.1 背景色、背景图片、字体大小的设置
  3. 实现全局双指长按返回桌面
  4. Android最好用的底部导航栏开发
  5. imx6 LAN8720A网口上电后连接不稳定link up,link down(二)
  6. sql数据类型转换(cast() and convent())函数)(转)
  7. Python告诉你《少年的你》为何刷爆票房?
  8. 纪念一位老友,记录一段往事
  9. HTML5制作显示歌词界面,以及添加超链接到第三方试听歌曲
  10. XML02:创建XML文件