基于AOP和ThreadLocal实现的一个简单Http API日志记录模块
Log4a
基于AOP和ThreadLocal实现的一个简单Http API日志记录模块
github地址 : https://github.com/EalenXie/log4a
在API每次被请求时,可以在整个方法调用链路中记录一条唯一的API请求日志,可以记录请求中的任意内容,比如传参,响应,请求url,method,clientIp,请求成功或异常,等等,以及HttpServletRequest中的任意内容。
实现的核心为AOP以及ThreadLocal。 AOP 会切所有被Log4a注解的方法,会记录一个线程中唯一一个LogDefine对象,抓取请求的内容和HttpServletRequest中的内容,并且可以完成自定义的日志收集(例如写入到数据库或者写入到文件),记录无论目标方法成功或失败,在执行完成后都将对ThreadLocal中的资源进行释放。
LogDefine 记录的内容
字段 | 类型 | 注释 | 是否默认记录 |
---|---|---|---|
clientIp | String | 请求客户端的Ip | 是 |
reqUrl | String | 请求地址 | 是 |
headers | String | 请求头部信息(可选择记录) | 是,默认记录user-agent |
type | String | 操作类型 | 是,默认值undefined |
content | StringBuilder | 操作类型 | 否,方法内容,可使用LogDefine.logger进行内容步骤记录 |
method | String | 请求的本地java方法 | 是 |
args | String | 方法请求参数 | 否 |
respBody | String | 方法响应参数 | 否 |
costTime | Long | 整个方法耗时 | 是 |
logDate | Date | Log产生时间 | 是,默认值是LogDefine对象初始化的时间 |
success | Boolean | 执行状态,成功(true)/异常(false) | 是,默认false |
Log4a 注解选项说明
选项 | 类型 | 说明 | 默认 |
---|---|---|---|
type | String | 操作类型 | 默认值"undefined" |
method | boolean | 是否记录请求的本地java方法 | true |
costTime | boolean | 是否记录整个方法耗时 | true |
headers | String[] | 记录的header信息 | 默认"User-Agent" |
args | boolean | 是否记录请求参数 | false |
respBody | boolean | 是否记录响应参数 | false |
stackTrace | boolean | 当目标方法发生异常时,是否追加异常堆栈信息到content | false |
costTime | boolean | 是否记录整个方法耗时 | true |
collector | Class<? extends LogCollector> | 指定日志收集器 | 默认空的收集器不指定 |
例子使用说明
@Log4a注解使用
直接在Controller 方法或类上加上注解@Log4a
,可以对该Controller中所有方法进行日志记录与收集
/**
* @author EalenXie Created on 2020/1/16 10:44.
* 测试接口 记录异常到堆栈,记录请求参数,和响应参数
*/
@Log4a(type = "测试API", stackTrace = true, args = true, respBody = true)
@RestController
public class DemoController {
@Resource
private DemoService demoService;
@PostMapping("/sayHello")
public ResponseEntity sayHello(@RequestBody Map<String, Object> request) {
demoService.sayHello(request);
return ResponseEntity.ok(request);
}
}
LogDefine.logger 记录详细
这里调用了service方法,还可以通过LogDefine.logger 方法记录每一个步骤详细内容
/**
* @author EalenXie Created on 2020/1/16 10:49.
*/
@Service
@Slf4j
public class DemoService {
/**
* 测试方法, 使用LogDefine.logger记录步骤
*/
public void sayHello(Map<String, Object> words) {
LogDefine.logger("1. 请求来了,执行业务动作");
log.info("do somethings");
LogDefine.logger("2. 业务动作执行完成");
}
}
自定义的全局日志收集器
本例中写了一个最简单的直接append写入到文件中,你可以选择自定义的方式进行日志收集
@Component
public class DemoLogCollector implements LogCollector {
@Override
public void collect(LogDefine define) throws LogCollectException {
try (FileWriter fw = new FileWriter("D:\\home\\temp\\日志.txt", true)) {
fw.append(define.toString());
} catch (IOException e) {
throw new LogCollectException(e);
}
}
}
测试后 , 可以从 日志.txt中提取到每次请求记录的日志内容。
{
"args": "{\"username\":\"ealen\",\"age\":12}",
"clientIp": "192.168.110.1",
"content": "1. 请求来了,执行业务动作\n2. 业务动作执行完成\n",
"costTime": 1,
"headers": "{\"User-Agent\":\"PostmanRuntime/7.21.0\"}",
"logDate": 1579144007437,
"method": "name.ealen.demo.cotroller.DemoController.sayHello",
"reqUrl": "http://localhost:9527/sayHello",
"respBody": "{\"body\":{\"username\":\"ealen\",\"age\":12},\"headers\":{},\"statusCode\":\"OK\",\"statusCodeValue\":200}",
"success": true,
"type": "测试API"
}
基于AOP和ThreadLocal实现的一个简单Http API日志记录模块的更多相关文章
- 基于AOP和ThreadLocal实现日志记录
基于AOP和ThreadLocal实现的一个日志记录的例子 主要功能实现 : 在API每次被请求时,可以在整个方法调用链路中记录一条唯一的API请求日志,可以记录请求中绝大部分关键内容.并且可以自定义 ...
- BitAdminCore框架应用篇:(二)创建一个简单的增删改查模块
NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/cookie ...
- php 简单通用的日志记录方法
使用file_put_contents 方法来实现简单便捷的日志记录功能 方法1: // use \r\n for new line on windows, just \n on linux func ...
- 基于Servlet、JSP、JDBC、MySQL的一个简单的用户注冊模块(附完整源代码)
近期看老罗视频,做了一个简单的用户注冊系统.用户通过网页(JSP)输入用户名.真名和password,Servlet接收后通过JDBC将信息保存到MySQL中.尽管是个简单的不能再简单的东西,但麻雀虽 ...
- 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (一)
介绍 Go 语言最近十分火热,但对于新手来说,想立马上手全新的语法和各种各样的框架还是有点难度的.即使是基础学习也很有挺有挑战性. 在这篇文章中,我想用最少的代码写出一个可用的 API 服务. ...
- 20181015记录一个简单的TXT日志类
20190422添加换行以及时间记录 using System; using System.Collections.Generic; using System.IO; using System.Lin ...
- 微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录
在前面的Part3中, 我介绍Policy Injection模块中内置的Call Handler的使用方法,今天则继续介绍Call Handler——Custom Call Handler,通过建立 ...
- springboot aop 自定义注解方式实现一套完善的日志记录(完整源码)
https://www.cnblogs.com/wenjunwei/p/9639909.html https://blog.csdn.net/tyrant_800/article/details/78 ...
- nodejs之log4js日志记录模块简单配置使用
在我的一个node express项目中,使用了log4js来生成日志并且保存到文件里,生成的文件如下: 文件名字叫:access.log 如果在配置log4js的时候允许了同时存在多个备份log文件 ...
随机推荐
- codeforce 382 div2 E —— 树状dp
题意:给一棵n个结点的无根树染色,求使每个结点距离为k的范围内至少有一个被染色的结点的总染色方法数目 分析:首先我们定义: 对于结点v, 如果存在一个黑色结点u距离v不超过k,则结点v被“控制” 首先 ...
- Spring 面试题汇总
1.什么是SpringSpring是一个轻量级IoC和AOP容器框架,是为Java应用程序提供基础性服务的一套框架,目的是简化企业应用程序的开发,它使得开发者只需关注业务需求. 2.Spring的优点 ...
- 2019-3-1-C#-double-好用的扩展
title author date CreateTime categories C# double 好用的扩展 lindexi 2019-3-1 9:19:5 +0800 2018-05-15 10: ...
- dotnet 使用 MessagePack 序列化对象
和很多序列化库一样,可以通过 MessagePack 序列化和反序列化,和 json 相比这个库提供了二进制的序列化,序列化之后的内容长度比 json 小很多 这个库能序列的内容不多,大多数时候建议使 ...
- sublimeText 3使用教程
工欲善利其事必先利其器,sublime作为一款轻量.便捷的编译工具,集成了很多插件,功能强大,深受大家的喜爱.掌握好sublime的具体用法,必会为你的工作带来极大的便利!好了,闲话不多说了,下面开始 ...
- Java并发机制的底层实现原理之volatile应用,初学者误看!
volatile的介绍: Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现 ...
- 49.植入HTML和自定义元件库
首先设置一个圆角矩形 设置鼠标单击时的k空用例 这样当鼠标单击时会有一个小手的图标 然后设置鼠标移入时的动作 鼠标移入时设置文本动作的文本
- 假期汇总表handler中涉及的基础知识
1,stringBuffer 的常用方法,append () 方法, public StringBuffer append(boolean b) 追加内容到当前StringBuffer对象的末尾 ,我 ...
- 驾驭git merge——git merge的规范化操作
这两天负责将一个开发了较长时间,代码量数万行的C语言项目(A项目)的代码分支合并到主线.由于之前参与过一些其他项目分支收编时采用git merge引入问题的修改,个人从心理上对git merge有所抵 ...
- 在win64上使用bypy进行百度网盘文件上传
阿里云服务器的带宽为2M,网站每日的备份包都3G多了,离线下载太费时间了,打算每日将备份包自动上传到自己的百度云盘里.1.先安装Python 执行python -V ,发现没安装python2.去py ...