修改别人写的利用AOP实现日志监控的问题

原创 2016年06月02日 10:57:25

原文链接

http://blog.csdn.net/jaune161/article/details/51476138

想法

看到原文博主写的这篇文章,我感觉写的很好,可以在我们的项目中使用AOP来监控用户的操作,后台管理员根据AOP记录的内容来实现统计功能,进行绩效考核

流程

Created with Raphaël 2.1.0开始编写User实体类编写业务逻辑接口类编写业务逻辑实现类编写AOP业务逻辑类编写而junit测试类

AOP应用参考文章

  1. http://www.cnblogs.com/wayfarer/articles/241024.html
  2. http://blog.csdn.net/moreevan/article/details/11977115/
  3. http://www.infoq.com/cn/articles/Orchestration-Oleg-Zhurakousky/

下面的内容主要是修复原博主文章中的不足的地方


User类

package com.springinaction.springidol;
public class User {

    private String username;
    private String password;

    public User() {
        super();
    }

    public User(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }
}

UserService 接口类

package com.springinaction.springidol;
//接口
public interface UserService {
    public void login(User user) throws AuthenticationException;
}

UserServiceImp (实现类)

package com.springinaction.springidol;
//实现类
public class UserServiceImpl implements UserService {

    public void login(User user) throws AuthenticationException {
        if("admin".equals(user.getUsername()) && "admin".equals(user.getPassword())){
            System.out.println("登录成功");
        }else{
            throw new AuthenticationException("用户名密码错误!");
        }
    }

}

织入点声明

这个类是实现登陆监控的主要业务逻辑实现.
1. 该类声明了一个切点loginPointcut, 使用aspect的语法来声明一个织入点
2. Around等注解的使用,请参考其他文章

package com.springinaction.springidol;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class LoginMonitor {

    @Pointcut("execution(* com.springinaction.springidol.UserService.login(..))")
    public void loginPointcut(){};

    @Around("loginPointcut()")
    public Object afterLogin(ProceedingJoinPoint point) throws Throwable{
        User user = (User) point.getArgs()[0];
        System.out.println(user.getUsername()+"请求登录系统");
        Object obj ;
        try {
            obj = point.proceed();
        } catch (Throwable e) {
            System.out.println(user.getUsername()+"登录失败!"+e.getMessage());
            throw e;
        }
        System.out.println(user.getUsername()+"已登录系统");
        return obj;
    }

}

Spring的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"

       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd

       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd

       http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    <context:annotation-config></context:annotation-config>
    <bean id="userService" class="com.springinaction.springidol.UserServiceImpl"/>
    <bean class="com.springinaction.springidol.LoginMonitor"/>
    <aop:aspectj-autoproxy/> <!-- 支持@Aspect注解 -->
</beans>

Junit测试类

package com.springinaction.springidol;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * Created by shugen on 16-6-2.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("spring-idol.xml")
public class TestCLass {
    @Autowired
    private UserService userService;

    @Test
    public void testLogin() throws AuthenticationException {
        User user = new User("admin","admin");
        userService.login(user);
    }
}

POM.xml(这里使用maven进行项目管理)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>rmb</artifactId>
  <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>3.1.1.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>3.1.1.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>3.1.1.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>3.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>3.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>3.1.1.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.2</version>
        </dependency>
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm</artifactId>
            <version>3.2</version>
        </dependency>
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm-commons</artifactId>
            <version>3.2</version>
        </dependency>
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm-util</artifactId>
            <version>3.2</version>
        </dependency>

    </dependencies>
    <packaging>war</packaging>
  <build>
    <finalName>Vue</finalName>
  </build>
</project>

注意问题

如果使用了1.6.2 的aspectjweaver和aspectjrt可能会导致一下错误
Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut loginPointcut
详细错误信息

Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut loginPointcut
    at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:317)
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:207)
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:193)
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:182)
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:163)
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:209)
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:263)
    at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:295)
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply

解决办法,使用高版本的aspectjweaver和aspectjrt

<dependency>
 <groupId>org.aspectj</groupId>
   <artifactId>aspectjweaver</artifactId>
   <version>1.8.2</version>
</dependency>
<dependency>
   <groupId>org.aspectj</groupId>
   <artifactId>aspectjrt</artifactId>
   <version>1.8.2</version>
</dependency>

程序运行验证

这里写图片描述

版权声明:同步发布:sixtrees.github.com https://my.oschina.net/itsyizu/blog/

关于AOP无法切入同类调用方法的问题

最近在开发中遇到一个问题,当在Service中定义了一个方法并且切入之后,从Controller里面调用该方法可以实现切入,但是当在同一个Service中实现另一方法并调用改方法时却无法切入。代码类似...
  • z69183787
  • z69183787
  • 2015年05月10日 17:44
  • 7492

浅谈Vue.js

作为一名Vue.js的忠实用户,我想有必要写点文章来歌颂这一门美好的语言了,我给它的总体评价是“简单却不失优雅,小巧而不乏大匠”,下面将围绕这句话给大家介绍Vue.js,希望能够激发你对Vue.js的...
  • z69183787
  • z69183787
  • 2016年09月07日 16:57
  • 4406

【挖坑】webservice接口、http接口的监控

目前在做的这个项目是个客服系统,系统中我们自己的功能不算多,绝大多数是调用各种外部系统的接口、集成页面等等,之前大致统计过有30+外部系统、200+接口(webservice接口及http接口)和集成...
  • mxmxz
  • mxmxz
  • 2016年08月10日 23:30
  • 3199

从头认识Spring-3.1 简单的AOP日志实现-某方法之前的前后记录日志

这一章节我们引入简单的AOP日志实现。1.domain蛋糕类:package com.raylee.my_new_spring.my_new_spring.ch03.topic_1_1; publi...
  • raylee2007
  • raylee2007
  • 2016年02月21日 22:48
  • 2059

Spring AOP实现复杂的日志记录(自定义注解)

前段时间做项目中,业务逻辑要求只要对数据库数据进行改动的都需要记录日志(增删改),记录的内容有操作者,操作的表名及表名称,具体的操作,以及对那条数据进行操作。当时想到的就是Spring 的AOP功能。...
  • mlc1218559742
  • mlc1218559742
  • 2016年06月28日 19:37
  • 7706

spring aop切面应用,记录日志、请求处理耗时

依赖jar包 aopalliance.jar、aspectjrt.jar、aspectjweaver-1.6.jar spring配置文件(标红部分): ...
  • hgg923
  • hgg923
  • 2016年05月25日 15:24
  • 2545

zabbix 3.0+saltstack实现对日志文件内容监控

近期对云主机所有服务监控内存溢出快照,防止服务内存溢出也不知道。 于是就引入的saltstack工具,首先查询所有被监控端的oom快照文件 # salt '*' cmd.run 'find /opt ...
  • Hu_wen
  • Hu_wen
  • 2017年04月18日 17:16
  • 1864

Zabbix Agent active主动模式监控日志(多关键字)

需求:监控/data/app/app/logs/det.log日志文件,出现关键字BDRC_WARNING则告警,级别为Warning;出现关键字:BDRC_EROROR则告警,级别为Informat...
  • wszll_Alex
  • wszll_Alex
  • 2017年08月09日 16:45
  • 1767

python动态监控日志内容

使用Python动态监控程序日志的内容,这里的动态指的是日志文件不断的追加新的日志内容,动态监控是指监控日志新追加的日志内容。 日志文件一般是按天产生,则通过在程序中判断文件的产生日期与当前时间...
  • vip_linux
  • vip_linux
  • 2014年07月07日 21:29
  • 2288

openfalcon的 日志文件监控 logdog

一个非常棒的插件 * https://github.com/sdvdxl/falcon-logdog下载解压后,需要配置一下文件就好了,我的一个典型配置文件如下:{ "logLevel": "W...
  • vbaspdelphi
  • vbaspdelphi
  • 2016年10月14日 17:22
  • 1675
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:修改别人写的利用AOP实现日志监控的问题
举报原因:
原因补充:

(最多只允许输入30个字)