基于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
- 基于springMVC 将log日志写入到数据库中
- Yii将需要的log写入到数据库中
- 将Log日志通过Hibernate保存到数据库中
- 开机启动时将log日志写入到SDcard
- Yii将需要的log写入到数据库中 (重新CDbLogRoute)
- 在后台日志中写入信息-输出信息到log
- Eclipse将console中的log写入到文件中
- 将web日志写入数据库
- 将Log4j日志写入数据库
- flume 模拟将日志内容写入到 hive中
- 使用log4j将日志信息写入数据库中
- .NET : 如何将大文件写入到数据库中
- java将数据库数据写入到Excel中
- python实例26[将log同时写入文件和显示到UI的控件中]
- 用log4j将日志写入数据库
- 成功利用Log4net将日志写入数据库!
- 使用log4j将日志写入oracle数据库
- 利用log4j将记录日志写入数据库
- 【Unity资源】(动作/双足)
- HeadFirstC笔记_13 十大遗漏知识点
- maven阿里仓库
- AndroidSQLite简单使用
- matlab中文函数手册.chm
- 基于springMVC 将log日志写入到数据库中
- opencv之cvScalar函数
- POJ1981 Circle and Points(计算几何)
- 新文件上传
- 输入框输入汉字的个数最多为10个
- Git命令
- 如何做好一个站长
- 发布网站(Publishing your Website)
- Perl 连接Oracle 出现OCI missing的问题及解决