- 浏览: 145460 次
- 性别:
- 来自: 合肥
文章分类
最新评论
-
hzyhush:
Java模拟登录新浪微博 -
meaemz:
大神,这是完整的代码吗?怎么没有没有main(),我要怎么调用 ...
Java模拟登录新浪微博 -
meaemz:
大神,这是完整的代码吗?怎么没有没有main(),是要自己写一 ...
Java模拟登录新浪微博 -
c_he_n:
最后执行结果怎么获取到url
Java模拟登录新浪微博 -
hvang1988:
18.JEgg Java多线程开发包 ,这个到底怎么样哦,资料 ...
Java 常用的第三方组件
在项目中要记录操作日志,可以通过spring的Aop技术去实现,下面是自己在项目是上面的应用,记录下。
1、在Controller层有方法执行前记录和方法执行后记录,定义2个注解类
在service记录异常日志信息
2、定义日志的切面类
3、在方法中做应用
Controller层
Service层
6、日志的记录效果
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、日志的记录效果
发表评论
-
spring mybatis多数据源切换(2)
2019-06-12 16:35 468在上一篇文章中写到,多数据源的切换是使用Java代码调用的,现 ... -
spring mybatis多数据源切换(1)
2019-06-05 23:00 461项目中既要连接mysql数据库又要连接sever sql数据库 ... -
Spring定时器的功能开发
2016-12-05 16:59 22131、使用quartz.jar包实现定时器功能,首先在项目中引入 ... -
Maven多模块SSM框架搭建
2016-12-05 15:07 1597整合SSM和Maven多模块,搭建一个简单的开发架构,具体的做 ... -
Hibernate缓存机制分析
2015-04-09 23:18 700复制代码 您可以通过点击 右下角 的按钮 来对文章内容作出评价 ... -
Spring管理事务的几种方式
2015-04-09 22:33 1005把Hibernate用到的数据源Datasource,Hibe ... -
Hibernate注解说明
2015-04-03 18:03 849/** * * @author liuguang ... -
struts2请求过程源码分析
2015-02-04 21:08 668struts2请求过程源码分析 这篇文章写的很好 分析很透彻 ... -
spring和mybatis泛型接口的整合(一)
2015-02-03 20:42 204701、这次使用spring和mybatis进行整合,使用spri ... -
spring和ibatis综合应用入门示例
2012-03-20 20:00 13091、最近几天在学习ibatis ... -
spring开发所需jar包
2012-03-14 09:17 1194spring2.5开发所需的jar包,上传到这里,方便下载使用 ... -
ibatis自动生成主键
2012-03-13 10:53 1088很多数据库支持自动生成主键的数据类型如(mysql)。不 ... -
ibatis入门教程
2012-03-12 20:41 184761、本文通过几个简单的示例,实现ibatis的增删改查的功能。 ... -
ibatis一对多示例
2012-03-12 15:20 15861、在实际开发中,iBATIS框架已经很普遍的使用,然而我们常 ... -
hibernate入门示例展示
2011-06-30 17:00 1280有很长一段时间没有使用hibernate进行开发了,最近闲来无 ...
相关推荐
通过以上步骤,我们就能在QT项目中实现一个基本的操作日志记录系统,将所有的`qDebug()`输出保存到本地TXT文件。这种方法不仅适用于开发阶段的调试,还可以在生产环境中用于长期的日志监控和分析,帮助开发者快速...
5. **事务管理**:在涉及数据库操作时,确保日志与事务同步,以便在回滚事务时也能撤销相应的日志记录。 在代码层面,对比操作前后,我们可以通过单元测试或集成测试来模拟不同的输入和场景,观察并验证操作记录...
总的来说,Kettle的日志记录是其强大功能的一个重要组成部分,它提供了丰富的选项和灵活性,以适应各种项目需求。通过深入理解并应用这些知识点,无论是开发还是维护Kettle项目,都能显著提升工作效率。
在实际项目中,日志记录可能需要更复杂的逻辑,如区分不同级别的日志(DEBUG、INFO、WARN、ERROR),写入不同的日志文件,甚至集成到专门的日志服务如Log4j或Logback。 总结来说,“基于切面的日志记录SSMdemo”是...
本主题聚焦于使用C#语言实现操作日志记录的功能,这对于理解C#编程、Asp.Net应用的运行机制以及如何通过日志提升软件的可维护性具有重要意义。 首先,C#是一种面向对象的编程语言,广泛应用于Windows和Web应用开发...
在实际应用中,ZHN.LogLib提供了丰富的API接口,使得日志记录操作简单直观。例如,只需一行代码,就可以轻松记录一条带有详细信息的日志条目,这对于调试和故障排查非常有帮助。同时,该库还支持自定义日志格式,...
本资源"安卓日志分析崩溃拦截相关-日志记录开源项目使用方法见说明.zip"提供了一个开源的日志记录工具,旨在帮助开发者更有效地收集和分析日志,以及拦截应用崩溃情况。 1. **日志记录**: 在Android系统中,开发者...
本资源包“日志记录,开源项目使用方法见说明.zip”包含了关于如何在Android项目中运用开源日志库的详细指南,对于代码学习、毕业设计以及Java开发者来说都是宝贵的参考资料。 首先,我们来了解一下日志记录在...
在实际的项目实践中,我们应当根据项目的需求和特点来设计日志记录的切面和通知,确保既能捕获到足够的信息,又不会对系统的性能造成太大的影响。随着技术的不断进步,日志记录的方法和工具也在不断地更新迭代,作为...
在ASP.NET开发中,记录错误日志是一项至关...最后,结合实际需求选择合适的方法或库,并进行适当的定制和扩展,以满足项目特定的日志记录需求。通过有效的错误日志管理,可以极大地提高开发效率和应用程序的稳定性。
在“LOGO日志记录”中,"LOGO"可能是"Logging Object"的缩写,指的是LabVIEW中的一个专门用于日志记录的对象或类。这个对象可能封装了上述日志组件的所有功能,并提供了简洁的接口供开发者使用。 压缩包内的“log...
在本文中,我们将深入探讨如何使用Qt5框架在Windows环境下实现TXT日志记录功能。Qt是一个跨平台的应用程序开发框架,广泛应用于GUI编程,同时也支持命令行界面和网络编程等。利用Qt,我们可以轻松地创建高效、可移植...
在Java开发中,日志记录是一项至关重要的任务,它帮助开发者追踪程序运行状态,定位问题。Log4j是Apache组织提供的一款广泛使用的日志框架,它允许开发者灵活地控制日志信息的输出。本文将详细讲解如何动态设置Log4j...
本篇将深入探讨如何在C++中实现日志记录到文件的功能。 首先,我们需要了解基本的日志记录概念。日志通常包含时间戳、日志级别(如DEBUG、INFO、WARNING、ERROR)、日志消息等信息。这些信息被格式化后写入到一个...
3. **日志记录**:在拦截器的实现中,`preHandle()`方法通常用于记录请求的开始,包括请求URL、参数、时间戳等信息。`postHandle()`方法可能用于记录处理结束的信息,而`afterCompletion()`方法可以用来记录整个请求...
总结来说,日志记录是软件开发和运维不可或缺的环节,开源日志项目提供了丰富的工具和方法来满足各种需求。理解并有效利用这些工具,可以显著提升我们的工作效率,保障系统的稳定运行。在具体实践中,我们需要根据...
总的来说,“日志记录系统”项目是一个实践C语言编程技能,特别是文件操作、函数重写和性能分析的好机会。通过这个系统,开发者可以更好地监控和理解其应用程序的行为,从而提高软件的稳定性和性能。
虽然审计日志提供了丰富的信息,但过度的日志记录可能会影响系统性能。因此,应合理设置日志级别和策略,避免对生产环境造成负面影响。同时,对于敏感信息,如密码、个人隐私等,应进行脱敏处理,以符合数据保护...
log4net是Apache组织下的一个开源项目,它为.NET Framework提供了一个强大的日志记录解决方案。这个框架支持多种日志输出方式,包括控制台、文件、数据库、网络等,且具有高度可配置性,可以满足不同项目的需求。 1...
本文将详细介绍如何在SpringBoot项目中集成Shiro实现简单的用户登录功能,并利用Logback进行日志记录。 首先,我们来看Shiro的登录实现。Shiro的核心组件包括Subject、SecurityManager、Realm等。Subject代表当前...