springboot通过aop自定义注解@Log实现日志打印

news2025/7/19 12:39:31

springboot通过aop自定义注解@Log实现日志打印

文章目录

    • 效果图
    • 实操步骤
      • 1.引入依赖
      • 2.自定义日志注解
      • 3.编写日志切面类
      • 4.UserController
      • 5.运行

效果图

image-20231101114226421

实操步骤

注意,本代码在springboot环境下运行,jdk1.8

1.引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
    <groupId>org.jodd</groupId>
    <artifactId>jodd</artifactId>
    <version>3.3.7</version>
</dependency>

2.自定义日志注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 日志注解
 * @author woniu
 */
@Retention(RetentionPolicy.RUNTIME) //注解在源码、字节码、运行期间都存在
@Target({ElementType.METHOD}) //作用在方法上
public @interface WoniuLog {
}

3.编写日志切面类

import com.alibaba.fastjson.JSONArray;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Optional;

import static jodd.util.MimeTypes.MIME_APPLICATION_JSON;

/**
 * 日志切面类
 * @author woniu
 */
@Aspect //代表这是一个切面类
@Component //注入到spring ioc
public class WoniuLogAspect {


    private static final Logger log = LoggerFactory.getLogger(WoniuLogAspect.class);


    public WoniuLogAspect() {
    }

    /**
     * 前置通知:
     * @annotation(WoniuLog) 表示切面只对加了@WoniuLog的方法生效
     */
    @Before("@annotation(WoniuLog)")
    public void doBefore(JoinPoint joinPoint) {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (requestAttributes != null) {
            HttpServletRequest request = requestAttributes.getRequest();
            String contentType = request.getContentType();
            //只有contentType=application/json 的才加日志打印
            if (StringUtils.isNotEmpty(contentType)&&contentType.contains(MIME_APPLICATION_JSON)) {
                Class<?> clazz = joinPoint.getTarget().getClass();
                Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
                log.info("------------------------------------------AOP日志start--------------------------------------------------------");
                log.info("[AOP日志]:类名:{}", clazz.getName());
                log.info("[AOP日志]:方法名:{}", method.getName());
                Optional.ofNullable(joinPoint.getArgs()).ifPresent(x -> {
                    for (Object arg : x) {
                        String temp = JSONArray.toJSONString(x);
                        log.info("[AOP日志]:方法入参:{}", temp);
                    }
                });
                log.info("------------------------------------------AOP日志end--------------------------------------------------------");
            }
        }


    }
  }

4.UserController

@ApiOperation(value = "查询分页列表")
@PostMapping("/pageList")
@WoniuLog
public Result<PageResult<UserRespVo>> pageList(@RequestBody UserReqVo reqVo) {
    PageResult<UserRespVo> result = userService.findList(reqVo);
    return Result.ok(result);
}

5.运行

image-20231101115310349

image-20231101114226421

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1157518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手机通讯录好备份,那微信通讯录怎么备份出来

6-8 众所周知的是&#xff0c;手机通讯录是很好备份的&#xff0c;但是微信不行&#xff0c;手机本身就带有备份功能&#xff0c;换手机可以快速地迁移通讯录&#xff0c;比如下面这个就是小米手机自带的备份功能&#xff0c;简单好用 但是现在生意可都在微信上做了&#xff0…

记一次flask框架环境综合渗透测试

PART.01 登入过程 访问靶场地址http://101.43.22.226/?name2023&#xff0c;框架为Flask。 2. 测试存在ssti注入。 3. 直接执行以下命令。 http://101.43.22.226/?name{% for c in [].class.base.subclasses() %} {% if c.name ‘catch_warnings’ %} {% for b in c.i…

42 深度学习(六):调参|保存模型以及再次调用或训练

文章目录 卷积神经网络调参optimizer 优化器SGDmomentumAdaGradRMSPropadam学习率自适应经验之谈 激活函数SigmoidTanhReLULeaky-ReLU指数线性单元(ELU)Maxout&#xff08;基本不用&#xff09;经验之谈 初始化全部为 0判断初始化好不好批归一化&#xff08;BN&#xff09; 数据…

Python项目——识别指定物品

目录 1、百度EasyDL平台数据配置 1.1、训练图像上传 1.2、训练图像进行标注 1.3、训练模型 1.4、检验识别 1.5、申请发布 1.6、控制台权限配置 2、Python调用物体识别API 本项目是基于百度EasyDL平台制作的识别转盘内瓶子&#xff0c;且识别瓶子位置的一个项目。通过在…

10步搭建跨境商城,打造全球销售帝国

我将向您介绍如何通过10个简明步骤搭建一个强大的跨境商城&#xff0c;从而打造一个覆盖全球的销售帝国。在这个全球化时代&#xff0c;跨境电商已成为许多企业扩大业务的关键途径。然而&#xff0c;搭建一个成功的跨境商城并不容易&#xff0c;需要充分了解市场需求、制定合适…

【java学习—十一】枚举类(2)

文章目录 1. 枚举类概述2. 实现接口的枚举类 1. 枚举类概述 在某些情况下&#xff0c;一个类的对象是有限而且固定的。例如季节类&#xff0c;只有4个对象&#xff1b; ①手动实现枚举类&#xff1a; • private 修饰构造器 • 属性使用 private final 修饰 • 把该类的所有实…

pod进阶--02

//示例4&#xff1a;就绪检测 vim readiness-httpget.yaml apiVersion: v1 kind: Pod metadata:name: readiness-httpgetnamespace: default spec:containers:- name: readiness-httpget-containerimage: soscscs/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcon…

安装pakachu靶场

1.路径 2.修改 3.安装 之后就成功了

众和策略可靠吗?pb是市净率吗?

可靠 市净率既是股市的常用方针&#xff0c;也是价值出资的重要东西之一&#xff0c;而PB也常被用来作为衡量企业估值的规范之一。但是&#xff0c;PB是不是就等同于市净率呢&#xff1f;本文将从多个视点来剖析PB是否等于市净率。 一、市净率和PB的界说 市净率通常指股票的…

Webpack构建慢如蜗牛?提升开发效率的速度优化秘籍!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、背…

一个平台搞定数据治理,让数据资产发挥价值

根据北京研精毕智信息咨询发布的调查报告&#xff0c;2018-2021年&#xff0c;全球数据存储量由30ZB上升至55ZB左右&#xff0c;年平均增长率约为27.8%。到2022年&#xff0c;数据总存储量进一步增加至65ZB以上&#xff0c;较2021年同期新增了约10ZB&#xff0c;同比增长18.2%。…

软件开发项目文档系列之八数据库设计说明书

数据库设计说明书是一个关键文档&#xff0c;它提供了有关数据库的详细信息&#xff0c;包括设计、结构、运行环境、数据安全、管理和维护等方面的内容。 1 引言 引言部分&#xff0c;简要介绍数据库设计说明书的目的和内容。这部分通常包括以下内容&#xff1a; 引言的目的…

Python如何使用datetime模块进行日期和时间的操作

目录 一、引言 二、datetime模块的基本使用 三、日期的运算 四、注意事项 总结 本文将对Python的datetime模块进行深入探讨&#xff0c;阐述如何使用该模块进行日期和时间的各种操作。我们将介绍日期和时间的基本操作&#xff0c;以及格式化、时区处理等高级操作&#xff…

区别对比|乐歌IE3智能升降电脑桌有必要买吗?我来告诉你

乐歌IE3作为升降桌产品线的基础升级款&#xff08;E2是基础款&#xff09;&#xff0c;有着很高的性价比&#xff0c;日常售价1799元的价格&#xff0c;就有着大部分实用的功能。就升降桌行业来看&#xff0c;达到这种外观设计和功能设计的程度来说&#xff0c;是已经很亲民的价…

errMsg: “chooseImage:fail api scope is not declared in the privacy agreement

小程序已经设置了隐私保护指引&#xff0c;但是chooseImage会报112错误 小程序后台提交隐私协议&#xff0c;基本设置 》服务内容声明》用户隐私保护指引 》去填写信息提交审核 文档参考&#xff1a;https://developers.weixin.qq.com/community/develop/article/doc/0006e28b…

matab读取包含struct混合类型的mat文件转为txt文件

现有一个mat文件&#xff0c;其内容如下&#xff1a; 目标&#xff1a;要将data.mat中的Obs_Iridium_A转为文本格式。 分析&#xff1a; data.mat里面包含了4个struct结构的成员&#xff0c;Obs_Iridium_A是其中之一&#xff0c;Obs_Iridium_A为1*7496维&#xff0c;7496代表…

使用 PyTorch 构建自定义 GPT

一、介绍 介绍大模型&#xff0c;首先考虑一下使用 ChatGPT、Bing Chat 或 Bard 。您是否想过拥有自己的 ChatGPT 会是什么样子&#xff1f;想象一下创建自己的 GPT 模型的兴奋程度。这确实是一种难以置信的感觉&#xff01; 为了开始构建自定义 GPT 的旅程&#xff0c;让我们仔…

韩山师范学院学子获第四届“火焰杯”软件测试开发选拔赛全国奖项

2023年10月12日&#xff0c;第四届“火焰杯”软件测试开发选拔赛颁奖仪式在信息科技大楼805机房举行。组委会成员测吧&#xff08;北京&#xff09;科技有限公司项目总监王雪冬担任颁奖嘉宾。计算机科学与技术系2020级汤新寅、江湘婷、李若诗同学获得第四届“火焰杯”软件测试开…

idea 配置checkstyle全过程

checkstyle是提高代码质量,检查代码规范的很好用的一款工具&#xff0c;本文简单介绍一下集成的步骤&#xff0c;并提供一份完整的checkstyle的代码规范格式文件&#xff0c;以及常见的格式问题的解决方法。 一&#xff0c;安装 打开idea的文件选项&#xff0c;选择设置&…

Linux权限+Shell和Linux的关系

文章目录 1.Shell存在的意义及作用1.1对于Shell的认知过程1.2Shell/图形化界面外壳程序的意义 2.对Linux权限的理解2.1对Linux权限的认知过程2.2对于Linux下ll指令显示的文件属性的认识 1.Shell存在的意义及作用 1.1对于Shell的认知过程 Linux是什么? Linux是一套免费使用和自…