基于AOP和ThreadLocal实现日志记录
主要功能实现 : 在API每次被请求时,可以在整个方法调用链路中记录一条唯一的API请求日志,可以记录请求中绝大部分关键内容。并且可以自定义实现对日志收集(直接标准输出,或写入到文件或数据库)。
比如传参,响应,请求url,请求方法,clientIp,耗时,请求成功或异常,请求头等等。
实现的核心为AOP以及ThreadLocal。
- AOP 会切所有被
@Log4a
注解的方法,会记录一个线程中唯一一个Log4对象,读取AOP中的方法信息(入参,方法等等) - 抓取请求的内容和HttpServletRequest中的内容,解析入参。
- 日志收集(自定义实现,建议该过程异步)
- 记录无论目标方法成功或失败,在执行完成后都将对ThreadLocal中的资源进行释放。
Log4 记录的内容
字段 | 类型 | 注释 | 是否默认记录 |
---|---|---|---|
clientIp | String | 请求客户端的Ip | 是 |
reqUrl | String | 请求地址 | 是 |
headers | Object | 请求头部信息(可选择记录) | 是,默认记录user-agent,content-type |
type | String | 操作类型 | 是,默认值undefined |
content | StringBuilder | 步骤内容信息 | 否,方法内容,可使用Log4.step进行内容步骤记录 |
Log4a 注解选项说明
字段 | 类型 | 注释 | 默认 |
---|---|---|---|
type | String | 操作类型 | 默认值"undefined" |
method | boolean | 是否记录请求的本地java方法 | true |
costTime | boolean | 是否记录整个方法耗时 | true |
headers | String[] | 记录的header信息 | 默认"User-Agent",“content-type” |
args | boolean | 是否记录请求参数 | true |
respBody | boolean | 是否记录响应参数 | true |
stackTrace | boolean | 当目标方法发生异常时,是否追加异常堆栈信息到content | false |
costTime | boolean | 是否记录整个方法耗时 | true |
collector | Class<? extends LogCollector> | 指定日志收集器 | 默认空的收集器不指定 |
例子使用说明
@Log4a注解使用
直接在Controller 方法或类上加上注解@Log4a
,可以对该Controller中所有方法进行日志记录与收集
例如 :
@Log4a(type = "测试API", stackTrace = true)
@RestController
public class DemoController {
@Resource
private DemoService demoService;
/**
* JSON数据测试
*/
@PostMapping("/sayHello")
public ResponseEntity<?> sayHello(@RequestBody Map<String, Object> request) {
demoService.sayHello(request);
return ResponseEntity.ok(request);
}
/**
* RequestParam 参数测试
*/
@PostMapping("/params")
public ResponseEntity<?> params(@RequestParam Integer a) {
return ResponseEntity.ok(a);
}
/**
* 无参测试
*/
@GetMapping("/noArgs"