基于springMVC 将log日志写入到数据库中

来源:互联网 发布:最强密码破解软件 编辑:程序博客网 时间:2024/06/04 01:19

小菜鸟一枚,在网上找了好多大神写的文档,然后整理一下运用在刚刚在项目中完成的基于springMVC将log日志写入到数据库中

1、自定义注解

@ResponseBody@RequestMapping("/bg/add")@UserlogInfo(description = "添加警员", module = "警员信息")public AjaxResult add(Police police) {return new AjaxResult(this.policeService.save(police));}

2、实现自定义注解方法

@Target({ElementType.METHOD,ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface UserlogInfo {String description() default "";String module() default "";}

3、在log4j里面配置查询和操作的日志

log4j.logger.queryLogger=INFO,anotherAppender1log4j.additivity.operateLogger=falselog4j.appender.anotherAppender1=org.apache.log4j.jdbc.JDBCAppenderlog4j.appender.anotherAppender1.URL=jdbc:postgresql://192.168.0.116:5432/efence_newlog4j.appender.anotherAppender1.driver=org.postgresql.Driverlog4j.appender.anotherAppender1.user=deeplanlog4j.appender.anotherAppender1.password=deeplanlog4j.appender.anotherAppender1.sql=INSERT INTO sm_query_log(date_time,message) VALUES('%d{yyyy-MM-dd HH:mm:ss}','{%m}')log4j.appender.anotherAppender1.layout=org.apache.log4j.PatternLayoutlog4j.appender.anotherAppender1.Encoding=UTF-8log4j.appender.anotherAppender1.Threshold = INFOlog4j.appender.anotherAppender1.BufferSize=10#queryLogger message:username description modul url args iplog4j.logger.operateLogger=INFO,anotherAppender2log4j.additivity.operateLogger=falselog4j.appender.anotherAppender2=org.apache.log4j.jdbc.JDBCAppenderlog4j.appender.anotherAppender2.URL=jdbc:postgresql://192.168.0.116:5432/efence_new#log4j.appender.anotherAppender2.URL=jdbc:postgresql://bd102:5432/efencelog4j.appender.anotherAppender2.driver=org.postgresql.Driverlog4j.appender.anotherAppender2.user=deeplanlog4j.appender.anotherAppender2.password=deeplanlog4j.appender.anotherAppender2.sql=INSERT INTO sm_operate_log(date_time,message) VALUES('%d{yyyy-MM-dd HH:mm:ss}','{%m}')log4j.appender.anotherAppender2.layout=org.apache.log4j.PatternLayoutlog4j.appender.anotherAppender2.Encoding=UTF-8log4j.appender.anotherAppender2.Threshold = INFOlog4j.appender.anotherAppender2.BufferSize=10

4、自定义一个控制日志输出的util方法

@Aspect@Componentpublic class SystemLogAsport {// 本地异常日志记录对象private static final Logger logger = org.apache.log4j.Logger.getLogger("operateLogger");// Controller层切点// @Pointcut("@annotation(cn.howso.utils.UserlogInfo)")@Pointcut("execution(* cn.howso.specialMP.controller.*.*(..))")public void controllerAspect() {// 切入点System.out.println("这是一个控制层所有方法切入点");}/** * 前置通知(Before advice) :在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。 * =====SysLogAspect前置通知开始===== *  * @param joinPoint */@Before("controllerAspect()")public void doBefore(JoinPoint joinPoint) {if (LoggerController.getEnable()) {handleLog(joinPoint, null);}}/** * 环绕通知(Around advice) * :包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的行为, * 也可以选择不执行。 =====SysLogAspect 环绕通知开始===== *  * @param joinPoint * @throws Throwable */@Around("controllerAspect()")public Object doAround(ProceedingJoinPoint pjo) throws Throwable {RequestAttributes requestAttr = RequestContextHolder.getRequestAttributes();HttpServletRequest request = ((ServletRequestAttributes) requestAttr).getRequest();List<String> list = new ArrayList<>();String uri = request.getRequestURI();list.add("uri=" + uri);long beginTime = System.currentTimeMillis();Object res = pjo.proceed();long endTime = System.currentTimeMillis();list.add("cost=" + (endTime - beginTime) * 1.0 / 1000);String[] args = new String[] {};System.out.println(ArrayUtil.join(list.toArray(args), "\t"));return res;}/** * 日志处理 * * @param joinPoint * @param e */private void handleLog(JoinPoint joinPoint, Exception e) {RequestAttributes requestAttr = RequestContextHolder.getRequestAttributes();HttpServletRequest request = ((ServletRequestAttributes) requestAttr).getRequest();// System.out.println("++++++++++"+request);StringBuilder msg = new StringBuilder();// 用户名 真实姓名 职能部门 功能模块 url 参数 访问IPtry {// 获得注解// UserlogInfo log = findAnnotation(joinPoint);String seperator = ",";Map<String, String[]> parameterMap = request.getParameterMap();StringBuilder parameterString = new StringBuilder();Set<Entry<String, String[]>> parameterSet = parameterMap.entrySet();for (Entry<String, String[]> entry : parameterSet) {parameterString.append(entry.getKey()).append("=").append(Arrays.toString(entry.getValue())).append(";");}if (parameterString.length() > 0) {parameterString.deleteCharAt(parameterString.length() - ";".length());} else {parameterString.append("null");}// 读取session中的用户Object userName = SessionUtils.getAttribute(Constants.SESSION_USER_NAME);Object trueName = SessionUtils.getAttribute(Constants.SESSION_TRUE_NAME);Object area = SessionUtils.getAttribute(Constants.SESSION_AREA);// 获取url、ip地址String url = request.getRequestURI();String ip = request.getRemoteAddr();msg.append(userName).append(seperator).append(trueName).append(seperator).append(area).append(seperator).append("人群分析").append(seperator).append(url).append(seperator).append(parameterString.toString().replaceAll("([\\{\\},])", "\\\\$0")).append(seperator).append(ip);logger.info(msg);/* * // 获取目标方法签名 String signature1 = * joinPoint.getSignature().toString(); String methodName = * signature1.substring(signature1.lastIndexOf(".") + 1, * signature1.indexOf("(")); // 获取类名 String classType = * joinPoint.getTarget().getClass().getName(); Class<?> clazz = * Class.forName(classType); String clazzName = clazz.getName(); * String[] paramNames = getParamterName(clazzName, * methodName);//获取参数名 List<Object> args = * Arrays.asList(joinPoint.getArgs()); //获取参数 List<Object> list = * new ArrayList<>(); // paramNames即参数名一一对应参数值 for (int i = 0; i < * paramNames.length; i++) { if(args.get(i) instanceof * HttpServletRequest){ continue; }else if(args.get(i) instanceof * HttpServletResponse){ continue; }else if(args.get(i) instanceof * ShiroHttpServletRequest){ continue; }else if(args.get(i) * instanceof ShiroHttpServletResponse){ continue; }else{ * mapPamar.put(paramNames[i], args.get(i)); } } for (String key : * mapPamar.keySet()) { list.add(key + "=" + mapPamar.get(key)); } * sb.append(userName+","+trueName+","+url+","+list+","+ip); */} catch (Exception exp) {logger.error("异常信息:{}", exp);System.out.println(exp);exp.printStackTrace();}}/** * 获得注解 *  * @param joinPoint * @return * @throws Exception */public static UserlogInfo findAnnotation(JoinPoint joinPoint) throws Exception {Signature signature = joinPoint.getSignature();MethodSignature methodSignature = (MethodSignature) signature;Method method = methodSignature.getMethod();if (method != null) {return method.getAnnotation(UserlogInfo.class);}return null;}}


0 0
原创粉丝点击