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日志记录模块的更多相关文章

  1. 基于AOP和ThreadLocal实现日志记录

    基于AOP和ThreadLocal实现的一个日志记录的例子 主要功能实现 : 在API每次被请求时,可以在整个方法调用链路中记录一条唯一的API请求日志,可以记录请求中绝大部分关键内容.并且可以自定义 ...

  2. BitAdminCore框架应用篇:(二)创建一个简单的增删改查模块

    NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/cookie ...

  3. php 简单通用的日志记录方法

    使用file_put_contents 方法来实现简单便捷的日志记录功能 方法1: // use \r\n for new line on windows, just \n on linux func ...

  4. 基于Servlet、JSP、JDBC、MySQL的一个简单的用户注冊模块(附完整源代码)

    近期看老罗视频,做了一个简单的用户注冊系统.用户通过网页(JSP)输入用户名.真名和password,Servlet接收后通过JDBC将信息保存到MySQL中.尽管是个简单的不能再简单的东西,但麻雀虽 ...

  5. 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (一)

    介绍   Go 语言最近十分火热,但对于新手来说,想立马上手全新的语法和各种各样的框架还是有点难度的.即使是基础学习也很有挺有挑战性.   在这篇文章中,我想用最少的代码写出一个可用的 API 服务. ...

  6. 20181015记录一个简单的TXT日志类

    20190422添加换行以及时间记录 using System; using System.Collections.Generic; using System.IO; using System.Lin ...

  7. 微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录

    在前面的Part3中, 我介绍Policy Injection模块中内置的Call Handler的使用方法,今天则继续介绍Call Handler——Custom Call Handler,通过建立 ...

  8. springboot aop 自定义注解方式实现一套完善的日志记录(完整源码)

    https://www.cnblogs.com/wenjunwei/p/9639909.html https://blog.csdn.net/tyrant_800/article/details/78 ...

  9. nodejs之log4js日志记录模块简单配置使用

    在我的一个node express项目中,使用了log4js来生成日志并且保存到文件里,生成的文件如下: 文件名字叫:access.log 如果在配置log4js的时候允许了同时存在多个备份log文件 ...

随机推荐

  1. Wannafly挑战赛15 C“出队”(约瑟夫环类问题)

    传送门 •参考资料 [1]:浅梦无痕 [2]:Esquecer [3]:My CSDN •题意 n 个人围成一圈,1,2 报数,报 1 的离队,求编号为 x 的第几次出队: •对博文[1]的理解 第一 ...

  2. dotnet core 发布只有一个 exe 的方法

    在 dotnet core 发布的时候,会使用很多文件,这样发给小伙伴使用的时候不是很清真,本文告诉大家一个非官方的方法通过 warp 将多个文件打包为一个文件 和之前相同的方式发布一个 dotnet ...

  3. Java语言中使用OpenMP

    从去年年中,开始学习Java,主要是维护公司用Java编写的服务器软件.目前,该服务器软件遇到一个问题,在下载大文件时,如果同时下载的用户很多, 服务器软件工作会出现异常,有的用户无法下载.服务器硬件 ...

  4. C# 高级面试题

    很少会有人可以答对,如果你遇到一个来面试的人实在嚣张,就可以用本文的题去打击 本文内容就看着玩,请不要在严肃的面试中问题这样的题目 如果面试到一个人可以回答出下面的题目也不能证明他的技术很强,只能说明 ...

  5. 【u035】奶牛的电信

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方 ...

  6. SPA+.NET Core3.1 GitHub第三方授权登录 使用AspNet.Security.OAuth.GitHub

    GitHub第三方授权登录 使用SPA+.NET Core3.1实现 GitHub第三方授权登录 类似使用AspNet.Security.OAuth.GitHub,前端使用如下:VUE+Vue-Rou ...

  7. Z字形变换 leetcode 6

    一.按行存储 1.解题思路 1.通过当前行的不断上下循环移动 2.将字符按序存放入vector中 3.最后再按行取出 2.代码及注释 class Solution { public: string c ...

  8. rest_framework框架下的Django声明和生命周期

    rest_framework框架下的Django声明和生命周期 Django声明周期(request) 客户端发起请求 请求经过wsgi wsgi: 是一个协议----web服务网关接口,即在web服 ...

  9. Java操作Jxl实现导出数据生成Excel表格数据文件

    实现:前台用的框架是Easyui+Bootstrap结合使用,需要引入相应的Js.Css文件.页面:Jsp.拦截请求:Servlet.逻辑处理:ClassBean.数据库:SQLserver. 注意: ...

  10. centos批量创建用户并发送邮件,(修订版)

    # cat user_create.sh echo -n "创建用户输入C,删除用户输入D!" read name function monitor() { if [ " ...