- 浏览: 142309 次
- 性别:
- 来自: 合肥
文章分类
最新评论
-
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 416在上一篇文章中写到,多数据源的切换是使用Java代码调用的,现 ... -
spring mybatis多数据源切换(1)
2019-06-05 23:00 400项目中既要连接mysql数据库又要连接sever sql数据库 ... -
Spring定时器的功能开发
2016-12-05 16:59 21611、使用quartz.jar包实现定时器功能,首先在项目中引入 ... -
Maven多模块SSM框架搭建
2016-12-05 15:07 1542整合SSM和Maven多模块,搭建一个简单的开发架构,具体的做 ... -
Hibernate缓存机制分析
2015-04-09 23:18 645复制代码 您可以通过点击 右下角 的按钮 来对文章内容作出评价 ... -
Spring管理事务的几种方式
2015-04-09 22:33 956把Hibernate用到的数据源Datasource,Hibe ... -
Hibernate注解说明
2015-04-03 18:03 795/** * * @author liuguang ... -
struts2请求过程源码分析
2015-02-04 21:08 621struts2请求过程源码分析 这篇文章写的很好 分析很透彻 ... -
spring和mybatis泛型接口的整合(一)
2015-02-03 20:42 203871、这次使用spring和mybatis进行整合,使用spri ... -
spring和ibatis综合应用入门示例
2012-03-20 20:00 12411、最近几天在学习ibatis ... -
spring开发所需jar包
2012-03-14 09:17 1104spring2.5开发所需的jar包,上传到这里,方便下载使用 ... -
ibatis自动生成主键
2012-03-13 10:53 1045很多数据库支持自动生成主键的数据类型如(mysql)。不 ... -
ibatis入门教程
2012-03-12 20:41 183891、本文通过几个简单的示例,实现ibatis的增删改查的功能。 ... -
ibatis一对多示例
2012-03-12 15:20 15381、在实际开发中,iBATIS框架已经很普遍的使用,然而我们常 ... -
hibernate入门示例展示
2011-06-30 17:00 1229有很长一段时间没有使用hibernate进行开发了,最近闲来无 ...
相关推荐
日志组件位于System.Database.dll中,项目引用命名空间(System.Logger)即可,日志组件提供五种级别的日志记录(DEBUG|INFO|WARN|ERROR|FATAL),最低DEBUG,最高FATAL,当配置的级别大于等于对应级别时,会自动记录...
日志组件位于System.Database.dll中,项目引用命名空间(System.Logger)即可,日志组件提供五种级别的日志记录(DEBUG|INFO|WARN|ERROR|FATAL),最低DEBUG,最高FATAL,当配置的级别大于等于对应级别时,会自动记录...
事件记录:日志文件用于记录应用程序的关键事件和操作,如启动、关闭、用户登录、数据操作等。这些事件记录对于追踪应用程序的运行状态和行为非常有用。 错误和异常信息:日志文件用于记录应用程序的错误和异常情况...
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式...
为Vue.js提供可自定义的日志记录功能。 与Vue2兼容。 目录 执照 演示版 @ https://codepen.io/justinkames/pen/BwGOVQ 介绍 vuejs-logger是一个工具,可为Vue应用程序启用可配置的日志记录。 功能包括: 基于所...
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出...
简介基于浏览器端的console的日志记录组件。支持如下特性:日志级别设置;异常提交到服务器;提交环境信息;日志Tag过滤器;如何使用浏览器下的引用[removed][removed][removed] log4web.log("houyhea"); log4...
1)用户的增删改查 项目中用到了springmvc的拦截器,只有登录才能操作 主管理员账号... 4)操作日志的记录和备份 采用的方法是利用aop拦截add,update方法来实现操作记录。 同时用了corn表达式来实现自动备份。
6、增加记录日志接口,用户可以使用SDK日志功能输出日志 7、logout 增加回调,解决快速切换帐号出现登录失败的问题 8、图片三档:原图,缩略图,大图,上传下载接口变更,传递图片路径 9、增加互踢功能 10、修复重复...
- 日志内容可包含级别、时间戳、线程信息、进程信息等; - 日志输出被设计为线程安全的方式,并支持 **异步输出** 及 **缓冲输出** 模式; - 支持多种操作系统([RT-Thread](http://www.rt-thread.org/)、UCOS、...
日志记录方法支持可变参数 日志输出格式:<时间> <线程ID> <日志级别> <日志内容> 性能: 性能是组件是否值得使用的硬指标,本组件从设计到编码的过程都尽量考虑到性能优化: ...
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的;... 当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:
该项目已成功集成执行器(监控),admin(可视化监控),logback(日志),aopLog(通过AOP记录web请求日志),统一异常处理( json级别和页面级别),freemarker(模板引擎),thymeleaf(模板引擎),Beetl(模板...
Log4J是Apache的一个开放源代码项目,它是一个日志操作包,通过使用Log4J,可以指定日志信息输出的目的地,如控制台、文件、CUI组件、NT的事件记录器;还可以控制每一条日志输出格式。此外,通过定义日志信息的...
日志日志,通常是系统,软件和应用程序的运行记录。 通过日志分析,可以方便用户了解系统的运行,软件和应用情况。 如果您的应用程序日志足够丰富,它还可以分析先前使用者的操作行为,类型,区域分布或其他更多...
该项目已成功集成actuator( 监控)、admin( 可视化监控)、logback( 日志)、aopLog( 通过AOP记录web请求日志)、统一异常处理( json级别和页面级别)、freemarker( 模板引擎)、thymeleaf( ) 模板引擎、Beetl( ) 模板引擎...
Log4J(Log for java)是Apache的一个开放源代码项目,它是一个日志操作包,通过使用Log4J,可以指定日志信息输出的目的地,如控制台、文件、CUI组件、NT的事件记录器;还可以控制每一条日志输出格式。此外,通过...
操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 数字化平台:支撑数据展示,定时动态刷新数据。热部署(SQL视图) 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 ...
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出...