博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过AOP自定义注解实现日志管理
阅读量:6352 次
发布时间:2019-06-22

本文共 4551 字,大约阅读时间需要 15 分钟。

前言:

通过自定义注解和AOP结合的方式,实现日志的记录功能

大致流程:项目运行->用户操作调用业务处理类->通过自定义的注解(我理解为一个切点)->进入到AOP切面类(在这里可以获得业务处理类的类名,方法名,通过request获取操作者ip,自定义的操作名,时间等)->把获取的信息记入数据库实现日志的记录->记录成功后返回业务处理类,下面是代码。

1.spring-mvc配置文件

  

2.自定义注解类

package com.bs.annotation;import java.lang.annotation.*;@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface SysLog {	String value() default "";}

  

3.AOP切面类

package com.bs.aop;import java.lang.reflect.Method;import java.text.DateFormat;import java.util.Date;import java.util.Enumeration;import javax.servlet.http.HttpServletRequest;import org.apache.commons.lang.StringUtils;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;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 com.bs.annotation.SysLog;import com.bs.basic.service.BsSysLogService;@Aspect@Componentpublic class LogAspect {	    private static final String LOG_CONTENT = "[类名]:%s 
[方法]:%s
[参数]:%s
[IP]:%s"; @Autowired public BsSysLogService logService; @Around("@annotation(com.bs.annotation.SysLog)") public Object saveLog(ProceedingJoinPoint joinPoint) throws Throwable{ DateFormat ddtf = DateFormat.getDateTimeInstance(); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); Object result = null; String methodName = joinPoint.getSignature().getName(); Method method = currentMethod(joinPoint, methodName); SysLog log = method.getAnnotation(SysLog.class); String content =buildeContent(joinPoint, methodName, request); logService.insert(content,ddtf.format(new Date()),"-",log.value()); try{ result=joinPoint.proceed(); }catch(Exception exception){ }finally{ } return result; } /** * 获取当前方法 * @param joinPoint * @param methodName * @return */ public Method currentMethod(ProceedingJoinPoint joinPoint,String methodName){ Method[] methods = joinPoint.getTarget().getClass().getMethods(); Method resultMethod = null; for (Method method : methods) { if (method.getName().equals(methodName)) { resultMethod = method; break; } } return resultMethod; } /** * 日志内容 * @param joinPoint * @param methodName * @param request * @return */ public String buildeContent(ProceedingJoinPoint joinPoint, String methodName, HttpServletRequest request) { String className = joinPoint.getTarget().getClass().getName(); Object[] params = joinPoint.getArgs(); StringBuffer bf = new StringBuffer(); if (params != null && params.length > 0) { Enumeration
paraNames = request.getParameterNames(); while (paraNames.hasMoreElements()) { String key = paraNames.nextElement(); bf.append(key).append("="); bf.append(request.getParameter(key)).append("&"); } if (StringUtils.isBlank(bf.toString())) { bf.append(request.getQueryString()); } } return String.format(LOG_CONTENT, className, methodName, bf.toString(),getRemoteAddress(request)); } /** * * 获取请求客户端ip * * @param request * * @return ip地址 * */ public static String getRemoteAddress(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) { ip = request.getRemoteAddr(); } return ip; }}

4.自定义注解配置在需要记录的业务处理类

@SysLog("删除场景")	@Override	public String deleteScene(String cmdValues) {		//业务逻辑....	}
@SysLog("更新场景")	@Override	public String updateScene(String value) {        //业务处理...}

...

记录的日志是这样的

转载于:https://www.cnblogs.com/zh-peng/p/10622878.html

你可能感兴趣的文章
OpenSSL 提取 pfx 数字证书公钥与私钥
查看>>
Keepalived详解(四):通过vrrp_script实现对集群资源的监控【转】
查看>>
CollapsingToolbarLayoutDemo【可折叠式标题栏,顺便带有CardView卡片式布局】
查看>>
CentOS7.4安装配置mysql5.7 TAR免安装版
查看>>
解决IE二级链接无法打开故障
查看>>
Windows phone应用开发[16]-数据加密
查看>>
SQL Server 迁移数据到MySQL
查看>>
通用数据压缩算法简介
查看>>
The next Industry Standard in IT Monitoring, a python implementation Nagios like tool --- Shinken
查看>>
(笔记)找工作,该怎么进补
查看>>
div的显示和隐藏以及点击图标的更改
查看>>
(轉貼) Ubuntu將在ARM平台netbook上現身 (SOC) (News) (Linux) (Ubuntu)
查看>>
SQL注入测试工具:Pangolin(穿山甲)
查看>>
在html 的img属性里只显示图片的部分区域(矩形,给出开始点和结束点),其他部份不显示,也不要拉伸...
查看>>
程序员第二定律:量化管理在程序员身上永无可能
查看>>
ubuntu一些脚本的执行顺序
查看>>
类继承的结构
查看>>
Intel 被 ARM 逼急了
查看>>
testng + reportng 测试结果邮件发送
查看>>
百度亮相iDASH,推动隐私保护在人类基因组分析领域的应用
查看>>