アノテーションを使用して、インターフェイスの操作ログを実装します

プロジェクトでは、インターフェースの操作ログを取得する必要があります。たとえば、インターフェイスのインターフェイス名、オペレータ、インターフェイスの実行時間、インターフェイスが属するサービス、インターフェイスのタイプ(追加、削除、変更、チェック)などを取得します。基本的なアプローチは、インターフェイスメソッドの実行後にこれらの操作レコードをライブラリに保存することです。このコードはインターフェイスで記述されますが、これは設計原則の単一責任原則に違反します。一般的な方法は、AOPを使用して、実行時にログコードを動的に挿入することです。ここでは注釈を付けて行います。

ロギングテーブルを作成する

まず、ログレコードテーブルを作成しましょう。

手術台

次に、エンティティクラスを記述します。

ログメモを書く

最初に注釈を定義しますOperationLog

この注釈では、いくつかのパラメーターが定義されています。

「「

opType:ビジネスタイプ

opBusinessName:メンバーシップサービス、注文サービスなどの会社名。

opBusinessId:ビジネスソースID、通常は主キーID

ビジネスタイプクラスを定義するOperationType

このビジネスタイプクラスは、インターフェイスのタイプ(追加、削除、変更、およびチェック)を定義します。

次に、アスペクトクラスを記述しますOperationLogAspect

メソッドの上にアノテーションを取得します。

Method method = ((MethodSignature) pjp.getSignature()).getMethod();
//获取目标方法上面的注解
OperationLog opLog = method.getAnnotation(OperationLog.class);

実施対象方法:

try {
    // 执行目标方法
    result = pjp.proceed();
} catch (Throwable throwable) {
    throw new Exception(throwable);
}

ターゲットメソッドの実行前後の実行時間を記録します。

TimeInterval timer = DateUtil.timer();
...
 // 执行目标方法
...
long executeTime = timer.intervalRestart(); 

アノテーションの式を解析すると、ビジネスIDが取得されます。

// 解析表达式,获取结果
String itemId = String.valueOf(expression.getValue(context));

データをオブジェクトにカプセル化します。

Operation operation = Operation.builder()
                    //.id(snowflake.nextId())
                    .opType(opLog.opType().name())
                    .opBusinessName(opLog.opBusinessName())
                    .opBusinessId(itemId)
                    .opTime(String.valueOf(executeTime))
                    //这里可以添加操作人
                    .build();

ログを記録し、倉庫に保管します。

private void handle(Operation operation) {
    // 通过日志打印输出
    log.info("opType = " + operation.getOpType() + ",opItem = " + operation.getOpBusinessName() + ",opItemId = " + operation.getOpBusinessId() + ",opTime = " + operation.getOpTime());
    // 持久化入库
    operationService.save(operation);
}

全体的なコードは次のとおりです。

テストノート

テストアノテーションコードは次のとおりです。

@RequestMapping("/getById")
@ResponseBody
@OperationLog(opType = OperationType.QUERY,opBusinessName = "会员服务",opBusinessId = "#id")
public Member getById(@RequestParam String id) {
    return memberService.getById(id);
}

このインターフェイスに、このインターフェイスの操作レコードを記録することを示すgetByIdメモ追加しました@OperationLogopTypeはクエリタイプ、それが属するビジネスはメンバーシップサービス、ビジネスIDはインターフェイスのパラメータIDです。

インターフェースを実行するコードを開始します。

コンソールはログを印刷しました:

また、データベースには次のレコードもあります。

これでコードは終わりです。もちろん、インターフェイス名のパスやインターフェイスのコールチェーンなどの情報をログレコードテーブルに追加することもできます。

過去におすすめ

QRコードをスキャンして、よりエキサイティングになります。または、WeChatLvshen_9を検索すると、返信してバックグラウンドで情報を取得できます

  1. 回复"java" 获取java电子书;

  2. 回复"python"获取python电子书;

  3. 回复"算法"获取算法电子书;

  4. 回复"大数据"获取大数据电子书;

  5. 回复"spring"获取SpringBoot的学习视频。

  6. 回复"面试"获取一线大厂面试资料

  7. 回复"进阶之路"获取Java进阶之路的思维导图

  8. 回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)

  9. 回复"总结"获取Java后端面试经验总结PDF版

  10. 回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)

  11. 回复"并发导图"获取Java并发编程思维导图(xmind终极版)

もう1つ:[マイベネフィット]をクリックして、さらに驚きを持ってください。

おすすめ

転載: blog.csdn.net/wujialv/article/details/109734732