`
y806839048
  • 浏览: 1117532 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

日志切面的设计(不同通知的日志用处)

阅读更多

日志切面;

日志的打印用切面拦截,切面中执行切点之前打印参数,执行切点之后打印返回的结果

 

方式一:用环绕通知把方法的请求,返回一起打印

 @Pointcut("execution(* com.houbank.incoming.web.controller..*(..)) and  @within(org.springframework.web.bind.annotation.Controller)")

    private void anyAcesssAndResponseMethdod() {

    }

 

 @Around("anyAcesssAndResponseMethdod()")中打印请求参数,返回结果都在这一个环绕通知中

 public Object doAround(ProceedingJoinPoint p) throws Throwable {

StringBuffer sb = new StringBuffer("类名:");

log.info(assemble(p,"doBefore"));

 

String targetName = p.getTarget().getClass().getName();

String methodName = p.getSignature().getName();

sb.append(targetName);

sb.append(".");

sb.append(methodName);

sb.append("()");

sb.append("--参数:");

Object result = null;

result = p.proceed();

try {

sb.append("serviceImpl_Result---"+ JSON.toJSONString(result));

sb.append("---serviceImpl_Result---END");

log.info(sb.toString());

} catch (Throwable e) {

log.error(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> CommonLog.doAround()" + "-参数:" + sb + e.getMessage(),e);

}

 

log.info(assemble(p,"doAfter"));

return result;

}

 

 

 

方式二:用前置通知,后置通知分别打印请求,返回数

 

@Pointcut("execution(* com.houbank.incoming.service.impl.*.*(..))")  

    public void methodPointcut() {}

 

@Before("methodPointcut()")

    public void before(JoinPoint joinPoint) {

        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();

        //查询不记录日志

        if(method.getName().startsWith("select") || method.getName().startsWith("get") || method.getName().startsWith("query")) {

        return;

        }

        StringBuilder sb = new StringBuilder();

        sb.append(method.getDeclaringClass().getSimpleName()).append(".").append(method.getName()).append(" req:");

        for(int i = 0; i < joinPoint.getArgs().length; i++) {

        sb.append(joinPoint.getArgs()[i]);

        }

        log.info(sb.toString());

    }

 

@AfterReturning(returning="rvt", pointcut="methodPointcut()")

    public void after(JoinPoint joinPoint, Object rvt) {

        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();

        //查询不记录日志

        if(method.getName().startsWith("select") || method.getName().startsWith("get") || method.getName().startsWith("query")) {

        return;

        }

        log.info(method.getDeclaringClass().getSimpleName() + "."+ method.getName() + " resp:" + rvt);

    }

 

 

然后异常通知打印异常时的日志

 

 

@AfterThrowing(value = "execution(* com.houbank.newapi.web.api..*.*(..))", throwing = "e")

public void doAfterThrowing(JoinPoint joinPoint, Throwable e) {

String errorMsg = assemble(joinPoint, "throwing") + e.getMessage();

log.error(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> CommonLog.assemble()" + "-参数:" + errorMsg);

}

 

 

分享到:
评论

相关推荐

    android面向切面AOP demo

    面向切面编程(Aspect-Oriented Programming,AOP)是一种编程范式,它旨在提高代码的可维护性和可重用性,通过将关注点(如日志、事务管理等)从核心业务逻辑中分离出来。在Android开发中,AOP也被广泛应用于处理如...

    aspectjrt-1.5.3-javadoc.jar.zip

    总的来说,AspectJRT 1.5.3提供了强大的面向切面编程支持,是Java开发者实现解耦和模块化设计的有力工具。通过深入学习其API和使用示例,开发者可以更有效地利用这一框架提升代码质量和可维护性。

    aspectjrt-1.6.6.jar.zip

    - **通知(Advice)执行**:AspectJRT负责执行切面中的通知方法,这些方法会在特定的连接点(Join Point)触发,如方法调用、构造函数执行等。 4. **版本1.6.6的改进与特性** - 提供了更好的性能优化,减少运行时...

    对Spring的AOP标签的支持

    Spring的AOP支持主要体现在XML配置文件中,其中包含了多种标签来定义切面、通知(advises)、切点(pointcuts)等。以下是一些关键的AOP标签及其用途: 1. `&lt;aop:config&gt;`:这是AOP配置的根元素,用于开启AOP功能。...

    aspectjweaver-1.6.11.M2.jar.zip

    - 理解切面的定义、连接点(join points)、切入点(pointcuts)和通知(advises),以精确控制切面的插入位置。 - 避免过度使用AOP,因为它可能会增加代码的复杂性,影响可读性和调试性。 总之,AspectJ Weaver ...

    AopTest

    标题"AopTest"暗示我们即将讨论的是面向切面编程(Aspect-Oriented Programming,简称AOP)相关的技术,这在IT行业中主要用于解决程序中的横切关注点,如日志记录、事务管理等。通常,AOP是通过一种称为切面的形式来...

    spring高级程序设计code

    AOP允许开发者定义“切面”,这些切面封装了系统的横切关注点,如日志、事务管理等。通过AOP,可以将这些关注点与业务逻辑解耦,实现更模块化的代码结构。 **Spring模块**: Spring框架由多个模块组成,包括Core ...

    aspectjrt-1.5.0-sources.jar.zip

    AOP是一种编程范式,它允许程序员定义“切面”,这些切面可以封装跨多个类和方法的横切关注点,如日志、事务管理和安全性。AspectJRT 提供了运行时环境,使得这些切面可以在Java应用程序中无缝地工作。 在1.5.0 ...

    JAVA面试题SSH重点.pdf

    - **通知**:通知是切面的具体行为,包括前置通知(在方法调用前执行)、后置通知(在方法调用后执行)、环绕通知(包围方法调用)、异常通知(在方法抛出异常后执行)。 - **连接点**:通知可以插入的位置,...

    基于JSP+SSM的美好生活日志网项目实战(源码+说明).zip

    Spring提供了依赖注入和AOP(面向切面编程)等功能;SpringMVC是Spring的Web MVC框架,负责处理HTTP请求和响应;MyBatis是一个轻量级的持久层框架,简化了数据库操作。 3. **Java源码**:项目的实现完全基于Java语言...

    weixin001基于小程序的购物系统设计与实现+ssm毕业源码案例设计.zip

    3. **SSM框架集成**:Spring的依赖注入、AOP(面向切面编程)、SpringMVC的控制器设计、MyBatis的SQL映射和动态SQL。 4. **数据库设计**:涉及关系型数据库(如MySQL)的基本概念、表结构设计、SQL语句编写,以及...

    操作Schedule Task的类库

    7. **错误处理和日志记录**:在操作计划任务时,可能会遇到各种问题,如权限不足、任务不存在等,良好的错误处理和日志记录机制是必要的。 8. **类库封装**:ScheduleTaskUtil这样的工具类库通常会提供一套友好的...

    Spring AOP 必用的三个jar包

    AOP是Spring框架的一个重要特性,它允许程序员定义“切面”,这些切面可以封装关注点,如日志、事务管理、性能监控等,从而使业务代码更专注于核心功能。在实现Spring AOP时,有三个关键的jar包:aopalliance.jar、...

    设计模式之代理模式

    在Java中,代理模式是实现AOP(面向切面编程)的一种基础,例如Spring框架中的AOP就是基于动态代理实现的,它可以让我们在不修改业务代码的情况下,进行跨切面的增强操作。总的来说,代理模式是软件设计中不可或缺的...

    面向方面编程_AOP_介绍.pdf

    2. **难以理解**:不同用途的代码交织在一起,影响开发人员和维护人员的理解。 3. **难以变更**:若需对系统进行升级或功能变更,开发人员需要同步修改几乎所有的相关模块。 为了解决这些问题,面向方面编程(AOP)...

    毕业设计-在线商超系统.zip

    2. **Spring框架**:Spring是Java企业级应用的主流框架,提供依赖注入、事务管理、AOP(面向切面编程)等功能,有助于构建松耦合的系统。 3. **JDBC与数据库操作**:Java Database Connectivity允许Java程序与各种...

    ssi框架完整jar包

    3. **aspectjweaver.jar**:AspectJ是一个面向切面编程(AOP)的Java扩展,用于添加跨切面的关注点,如日志、事务管理等。在Struts 2或Spring框架中,它可以用来实现更细粒度的控制和模块化。 4. **ojdbc14.jar**:...

    基于springboot的权限管理系统+源代码+文档说明

    - 日志切面 - 集中式会话管理 # 技术概览 ### 后端 - 基础框架:Spring Boot 2 - 持久层框架:Mybatis - 安全框架:Apache Shiro - 摸板引擎:Thymeleaf - 数据库连接池:阿里巴巴Druid - 缓存框架:Redis -...

Global site tag (gtag.js) - Google Analytics