`
tonyJ
  • 浏览: 145460 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

项目操作日志记录(方法级别)

 
阅读更多
在项目中要记录操作日志,可以通过spring的Aop技术去实现,下面是自己在项目是上面的应用,记录下。
1、在Controller层有方法执行前记录和方法执行后记录,定义2个注解类
package com.winning.common.systemlog;

import java.lang.annotation.*;

/**  
 *自定义注解 拦截Controller
 * 在进入Controller之前进行拦截
 */    
    
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SystemLogAfterController {
	
	String description()  default "";

	String czmk() default "";
}



package com.winning.common.systemlog;

import java.lang.annotation.*;

/**  
 *自定义注解 拦截Controller
 * 在进入Controller后拦截
 */    
    
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SystemLogBeforeController {
	
	String description()  default "";

	String czmk() default  "";
}


在service记录异常日志信息
package com.winning.common.systemlog;

import java.lang.annotation.*;


/**
 * 拦截Service进行异常日志记录
 * @author TonyJ
 *
 */
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SystemLogService {
	String description()  default "";
	String czmk() default  "";
}


2、定义日志的切面类
package com.winning.common.systemlog;

import com.alibaba.fastjson.JSON;
import com.winning.common.constant.Constants;
import com.winning.common.entitys.system.LoginUser;
import com.winning.common.entitys.system.SysLog;
import com.winning.common.service.SysCzrzService;
import com.winning.common.utils.ShiroUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
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 javax.servlet.http.HttpSession;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Aspect
@Component
public class SystemLogAspect {

	@Autowired
	private SysCzrzService sysCzrzService;

	// 本地异常日志记录对象
	private static final Logger logger = LoggerFactory.getLogger(SystemLogAspect.class);

	// Controller层切点 之前
	@Pointcut("@annotation(com.winning.common.systemlog.SystemLogBeforeController)")
	public void controllerBeforeAspect() {
	}
	
	// Controller层切点 之后
	@Pointcut("@annotation(com.winning.common.systemlog.SystemLogAfterController)")
	public void controllerAfterAspect() {
	}
	
	//service层切点
	@Pointcut("@annotation(com.winning.common.systemlog.SystemLogService)")
	public void serviceAspect(){
		
	}
	
	/**  
     * 异常通知 用于拦截service层记录异常日志  
     *  
     * @param joinPoint  
     * @param e  
     */    
     @AfterThrowing(pointcut = "serviceAspect()", throwing = "e")
     public  void doAfterThrowing(JoinPoint joinPoint, Throwable e) {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String uri = request.getRequestURI();
		 // 读取session中的用户
		 LoginUser loginUser = ShiroUtils.getLoginUser();
		 // 请求的IP
		 String ip = ShiroUtils.getIp();
        String params = "";
         if (joinPoint.getArgs() !=  null && joinPoint.getArgs().length > 0) {    
             for ( int i = 0; i < joinPoint.getArgs().length; i++) {    
                params += JSON.toJSONString(joinPoint.getArgs()[i]) + ";";
            }    
        }    
         try {
         	/*==========数据库日志=========*/
            SysLog log = new SysLog();
            log.setCznr(getServiceMthodDescription(joinPoint).get("description"));
           	log.setRzlx("2");
           	log.setCzsj(new Date());
           	log.setCzr(loginUser.getId()+"");
           	log.setIpdz(ip);
           	log.setQqdz(uri);
           	log.setJgbm(loginUser.getJgbm());
           	log.setYcxx("异常code:"+e.getClass().getName()+",异常详情:"+e.getMessage());
           	log.setDmxx((joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()")+",params:"+params);
            //保存数据库
			 sysCzrzService.saveLog(log);

        }  catch (Exception ex) {
            //记录本地异常日志    
            logger.error("==异常通知异常==");    
            logger.error("异常信息:{}", ex.getMessage());    
        }    
         /*==========记录本地异常日志==========*/    
        logger.error("异常方法:{}异常代码:{}异常信息:{}参数:{}", joinPoint.getTarget().getClass().getName() + joinPoint.getSignature().getName(), e.getClass().getName(), e.getMessage(), params);    
    
    }    
	
	@After("controllerAfterAspect()")
	public void doAfter(JoinPoint joinPoint){
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
		String uri = request.getRequestURI();
		// 读取session中的用户
		LoginUser loginUser = ShiroUtils.getLoginUser();
		// 请求的IP
		String ip = ShiroUtils.getIp();

		try {
			// *========数据库日志=========*//
			SysLog log = new SysLog();
			log.setCznr(getAfterControllerMethodDescription(joinPoint).get("description"));
			log.setCzmk(getAfterControllerMethodDescription(joinPoint).get("czmk"));
			log.setRzlx("1");
			log.setCzsj(new Date());
			log.setCzr(loginUser.getId()+"");
			log.setIpdz(ip);
			log.setQqdz(uri);
			log.setJgbm(loginUser.getJgbm());
			log.setDmxx((joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()"));
			// 保存数据库
			sysCzrzService.saveLog(log);

		} catch (Exception e) {
			// 记录本地异常日志
			logger.error("==后置通知异常==");
			logger.error("异常信息:{}", e.getMessage());
		}
	}

	/**
	 * 前置通知 用于拦截Controller层记录用户的操作
	 * @param joinPoint
	 *            切点
	 */
	@Before("controllerBeforeAspect()")
	public void doBefore(JoinPoint joinPoint) {
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
		String uri = request.getRequestURI();
		// 读取session中的用户
		LoginUser loginUser = ShiroUtils.getLoginUser();
		// 请求的IP
		String ip = ShiroUtils.getIp();

		try {
			// *========数据库日志=========*//
			SysLog log = new SysLog();
			log.setCznr(getBeforeControllerMethodDescription(joinPoint).get("description"));
			log.setCzmk(getBeforeControllerMethodDescription(joinPoint).get("czmk"));
			log.setRzlx("1");
			log.setCzsj(new Date());
			log.setCzr(loginUser.getId()+"");
			log.setIpdz(ip);
			log.setQqdz(uri);
			log.setJgbm(loginUser.getJgbm());
			log.setDmxx((joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()"));
			// 保存数据库
			sysCzrzService.saveLog(log);

		} catch (Exception e) {
			// 记录本地异常日志
			logger.error("==前置通知异常==");
			logger.error("异常信息:{}", e.getMessage());
		}
	}

	/**
	 * 获取注解中对方法的描述信息 用于Controller层注解
	 * 
	 * @param joinPoint
	 *            切点
	 * @return 方法描述
	 * @throws Exception
	 */
	public static Map<String,String> getBeforeControllerMethodDescription(JoinPoint joinPoint)
			throws Exception {
		String targetName = joinPoint.getTarget().getClass().getName();
		String methodName = joinPoint.getSignature().getName();
		Object[] arguments = joinPoint.getArgs();
		Class targetClass = Class.forName(targetName);
		Method[] methods = targetClass.getMethods();
		Map<String,String> resultMap = new HashMap<String,String>();
		String description = "";
		String czmk = "";
		for (Method method : methods) {
			if (method.getName().equals(methodName)) {
				Class[] clazzs = method.getParameterTypes();
				if (clazzs.length == arguments.length) {
					description = method.getAnnotation(
							SystemLogBeforeController.class).description();
					czmk = method.getAnnotation(
							SystemLogBeforeController.class).czmk();
					resultMap.put("description",description);
					resultMap.put("czmk",czmk);
					break;
				}
			}
		}
		return resultMap;
	}
	
	public static Map<String,String> getAfterControllerMethodDescription(JoinPoint joinPoint)
			throws Exception {
		String targetName = joinPoint.getTarget().getClass().getName();
		String methodName = joinPoint.getSignature().getName();
		Object[] arguments = joinPoint.getArgs();
		Class targetClass = Class.forName(targetName);
		Method[] methods = targetClass.getMethods();
		Map<String,String> resultMap = new HashMap<String,String>();
		String description = "";
		String czmk = "";
		for (Method method : methods) {
			if (method.getName().equals(methodName)) {
				Class[] clazzs = method.getParameterTypes();
				if (clazzs.length == arguments.length) {
					description = method.getAnnotation(
							SystemLogAfterController.class).description();
					czmk = method.getAnnotation(
							SystemLogAfterController.class).czmk();
					resultMap.put("description",description);
					resultMap.put("czmk",czmk);
					break;
				}
			}
		}
		return resultMap;
	}
	 /**  
     * 获取注解中对方法的描述信息 用于service层注解  
     *  
     * @param joinPoint 切点  
     * @return 方法描述  
     * @throws Exception
     */    
     public  static Map<String,String> getServiceMthodDescription(JoinPoint joinPoint)
             throws Exception {
        String targetName = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        Object[] arguments = joinPoint.getArgs();
        Class targetClass = Class.forName(targetName);
        Method[] methods = targetClass.getMethods();
        Map<String,String> resultMap = new HashMap<String,String>();
        String description = "";
        String czmk = "";
         for (Method method : methods) {
             if (method.getName().equals(methodName)) {    
                Class[] clazzs = method.getParameterTypes();
                 if (clazzs.length == arguments.length) {    
                    description = method.getAnnotation(SystemLogService.class).description();
                    czmk = method.getAnnotation(
							SystemLogService.class).czmk();
                    resultMap.put("description",description);
                    resultMap.put("czmk",czmk);
                     break;    
                }    
            }    
        }    
         return resultMap;
    } 
}


3、在方法中做应用
Controller层
/**
     * 操作日志首页
     * @param mapAdapter
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value = "init")
    @SystemLogAfterController(description = "操作日志首页初始化",czmk = "操作日志")
    public ModelAndView init(@RequestMap MapAdapter mapAdapter, HttpServletRequest request, HttpServletResponse response) {
        mapAdapter.getMap().put("basePath", request.getContextPath() + "/");
        return new ModelAndView("jsp/system/czrz/czrzInit",mapAdapter.getMap());
    }


Service层
@Override
    @SystemLogService(description = "保存操作日志",czmk = "操作日志")
    public void saveLog(SysLog sysLog) throws Exception {
        sysCzrzDao.insert(sysLog);
    }

    @Override
    @SystemLogService(description = "查询操作日志",czmk = "操作日志")
    public Map<String, Object> queryLogList(Map<String, Object> map) throws Exception {
        PageInfo pageInfo=sysCzrzDao.selectPage("com.winning.common.dao.impl.SysCzrzDaoImpl.selectPage",map);
        return  CommonUtils.pageInfoToBootstrapList(pageInfo);
    }


6、日志的记录效果


  • 大小: 44.8 KB
分享到:
评论

相关推荐

    QT添加操作日志记录

    通过以上步骤,我们就能在QT项目中实现一个基本的操作日志记录系统,将所有的`qDebug()`输出保存到本地TXT文件。这种方法不仅适用于开发阶段的调试,还可以在生产环境中用于长期的日志监控和分析,帮助开发者快速...

    java-操作记录-对比操作前后不同

    5. **事务管理**:在涉及数据库操作时,确保日志与事务同步,以便在回滚事务时也能撤销相应的日志记录。 在代码层面,对比操作前后,我们可以通过单元测试或集成测试来模拟不同的输入和场景,观察并验证操作记录...

    Kettle运行日志记录

    总的来说,Kettle的日志记录是其强大功能的一个重要组成部分,它提供了丰富的选项和灵活性,以适应各种项目需求。通过深入理解并应用这些知识点,无论是开发还是维护Kettle项目,都能显著提升工作效率。

    基于切面的日志记录SSMdemo

    在实际项目中,日志记录可能需要更复杂的逻辑,如区分不同级别的日志(DEBUG、INFO、WARN、ERROR),写入不同的日志文件,甚至集成到专门的日志服务如Log4j或Logback。 总结来说,“基于切面的日志记录SSMdemo”是...

    操作日志(源程序C#)

    本主题聚焦于使用C#语言实现操作日志记录的功能,这对于理解C#编程、Asp.Net应用的运行机制以及如何通过日志提升软件的可维护性具有重要意义。 首先,C#是一种面向对象的编程语言,广泛应用于Windows和Web应用开发...

    日志记录器

    在实际应用中,ZHN.LogLib提供了丰富的API接口,使得日志记录操作简单直观。例如,只需一行代码,就可以轻松记录一条带有详细信息的日志条目,这对于调试和故障排查非常有帮助。同时,该库还支持自定义日志格式,...

    安卓日志分析崩溃拦截相关-日志记录开源项目使用方法见说明.zip

    本资源"安卓日志分析崩溃拦截相关-日志记录开源项目使用方法见说明.zip"提供了一个开源的日志记录工具,旨在帮助开发者更有效地收集和分析日志,以及拦截应用崩溃情况。 1. **日志记录**: 在Android系统中,开发者...

    日志记录,开源项目使用方法见说明.zip

    本资源包“日志记录,开源项目使用方法见说明.zip”包含了关于如何在Android项目中运用开源日志库的详细指南,对于代码学习、毕业设计以及Java开发者来说都是宝贵的参考资料。 首先,我们来了解一下日志记录在...

    JAVA实现通用日志记录方法

    在实际的项目实践中,我们应当根据项目的需求和特点来设计日志记录的切面和通知,确保既能捕获到足够的信息,又不会对系统的性能造成太大的影响。随着技术的不断进步,日志记录的方法和工具也在不断地更新迭代,作为...

    ASP.NET中记录错误日志方法

    在ASP.NET开发中,记录错误日志是一项至关...最后,结合实际需求选择合适的方法或库,并进行适当的定制和扩展,以满足项目特定的日志记录需求。通过有效的错误日志管理,可以极大地提高开发效率和应用程序的稳定性。

    log组件_labview日志组件_LOGO日志记录_

    在“LOGO日志记录”中,"LOGO"可能是"Logging Object"的缩写,指的是LabVIEW中的一个专门用于日志记录的对象或类。这个对象可能封装了上述日志组件的所有功能,并提供了简洁的接口供开发者使用。 压缩包内的“log...

    qt实现txt日志记录功能

    在本文中,我们将深入探讨如何使用Qt5框架在Windows环境下实现TXT日志记录功能。Qt是一个跨平台的应用程序开发框架,广泛应用于GUI编程,同时也支持命令行界面和网络编程等。利用Qt,我们可以轻松地创建高效、可移植...

    动态设置log4j的日志级别

    在Java开发中,日志记录是一项至关重要的任务,它帮助开发者追踪程序运行状态,定位问题。Log4j是Apache组织提供的一款广泛使用的日志框架,它允许开发者灵活地控制日志信息的输出。本文将详细讲解如何动态设置Log4j...

    c++记录日志到文件里面

    本篇将深入探讨如何在C++中实现日志记录到文件的功能。 首先,我们需要了解基本的日志记录概念。日志通常包含时间戳、日志级别(如DEBUG、INFO、WARNING、ERROR)、日志消息等信息。这些信息被格式化后写入到一个...

    拦截器记录日志

    3. **日志记录**:在拦截器的实现中,`preHandle()`方法通常用于记录请求的开始,包括请求URL、参数、时间戳等信息。`postHandle()`方法可能用于记录处理结束的信息,而`afterCompletion()`方法可以用来记录整个请求...

    日志记录,开源项目使用方法见说明.rar

    总结来说,日志记录是软件开发和运维不可或缺的环节,开源日志项目提供了丰富的工具和方法来满足各种需求。理解并有效利用这些工具,可以显著提升我们的工作效率,保障系统的稳定运行。在具体实践中,我们需要根据...

    日志记录系统

    总的来说,“日志记录系统”项目是一个实践C语言编程技能,特别是文件操作、函数重写和性能分析的好机会。通过这个系统,开发者可以更好地监控和理解其应用程序的行为,从而提高软件的稳定性和性能。

    boot项目审计日志功能ideal源码

    虽然审计日志提供了丰富的信息,但过度的日志记录可能会影响系统性能。因此,应合理设置日志级别和策略,避免对生产环境造成负面影响。同时,对于敏感信息,如密码、个人隐私等,应进行脱敏处理,以符合数据保护...

    日志文件记录代码

    log4net是Apache组织下的一个开源项目,它为.NET Framework提供了一个强大的日志记录解决方案。这个框架支持多种日志输出方式,包括控制台、文件、数据库、网络等,且具有高度可配置性,可以满足不同项目的需求。 1...

    shiro简单登录+logback日志记录

    本文将详细介绍如何在SpringBoot项目中集成Shiro实现简单的用户登录功能,并利用Logback进行日志记录。 首先,我们来看Shiro的登录实现。Shiro的核心组件包括Subject、SecurityManager、Realm等。Subject代表当前...

Global site tag (gtag.js) - Google Analytics