使用Spring进行统一日志管理 + 统一异常管理

统一日志和异常管理配置好后,SSH项目中,代码以往散落的log.info() 和 try..catch..finally 再也不见踪影!

统一日志异常实现类:

[java] view plain copy

  1. package com.pilelot.web.util;
  2. import org.apache.log4j.Logger;
  3. import org.springframework.aop.ThrowsAdvice;
  4. import org.springframework.dao.DataAccessException;
  5. import java.io.IOException;
  6. import java.lang.reflect.Method;
  7. import java.sql.SQLException;
  8. /**
  9. * 由Spring AOP调用 输出异常信息,把程序异常抛向业务异常
  10. *
  11. * @author Andy Chan
  12. *
  13. */
  14. public class ExceptionAdvisor implements ThrowsAdvice
  15. {
  16. public void afterThrowing(Method method, Object[] args, Object target,
  17. Exception ex) throws Throwable
  18. {
  19. // 在后台中输出错误异常异常信息,通过log4j输出。
  20. Logger log = Logger.getLogger(target.getClass());
  21. log.info("**************************************************************");
  22. log.info("Error happened in class: " + target.getClass().getName());
  23. log.info("Error happened in method: " + method.getName());
  24. for (int i = 0; i < args.length; i++)
  25. {
  26. log.info("arg[" + i + "]: " + args[i]);
  27. }
  28. log.info("Exception class: " + ex.getClass().getName());
  29. log.info("ex.getMessage():" + ex.getMessage());
  30. ex.printStackTrace();
  31. log.info("**************************************************************");
  32. // 在这里判断异常,根据不同的异常返回错误。
  33. if (ex.getClass().equals(DataAccessException.class))
  34. {
  35. ex.printStackTrace();
  36. throw new BusinessException("数据库操作失败!");
  37. } else if (ex.getClass().toString().equals(
  38. NullPointerException.class.toString()))
  39. {
  40. ex.printStackTrace();
  41. throw new BusinessException("调用了未经初始化的对象或者是不存在的对象!");
  42. } else if (ex.getClass().equals(IOException.class))
  43. {
  44. ex.printStackTrace();
  45. throw new BusinessException("IO异常!");
  46. } else if (ex.getClass().equals(ClassNotFoundException.class))
  47. {
  48. ex.printStackTrace();
  49. throw new BusinessException("指定的类不存在!");
  50. } else if (ex.getClass().equals(ArithmeticException.class))
  51. {
  52. ex.printStackTrace();
  53. throw new BusinessException("数学运算异常!");
  54. } else if (ex.getClass().equals(ArrayIndexOutOfBoundsException.class))
  55. {
  56. ex.printStackTrace();
  57. throw new BusinessException("数组下标越界!");
  58. } else if (ex.getClass().equals(IllegalArgumentException.class))
  59. {
  60. ex.printStackTrace();
  61. throw new BusinessException("方法的参数错误!");
  62. } else if (ex.getClass().equals(ClassCastException.class))
  63. {
  64. ex.printStackTrace();
  65. throw new BusinessException("类型强制转换错误!");
  66. } else if (ex.getClass().equals(SecurityException.class))
  67. {
  68. ex.printStackTrace();
  69. throw new BusinessException("违背安全原则异常!");
  70. } else if (ex.getClass().equals(SQLException.class))
  71. {
  72. ex.printStackTrace();
  73. throw new BusinessException("操作数据库异常!");
  74. } else if (ex.getClass().equals(NoSuchMethodError.class))
  75. {
  76. ex.printStackTrace();
  77. throw new BusinessException("方法末找到异常!");
  78. } else if (ex.getClass().equals(InternalError.class))
  79. {
  80. ex.printStackTrace();
  81. throw new BusinessException("Java虚拟机发生了内部错误");
  82. } else
  83. {
  84. ex.printStackTrace();
  85. throw new BusinessException("程序内部错误,操作失败!" + ex.getMessage());
  86. }
  87. }
  88. }

自定义业务异常处理类 友好提示:

[java] view plain copy

  1. package com.pilelot.web.util;
  2. /**
  3. * 自定义业务异常处理类    友好提示
  4. * @author Andy Chan
  5. *
  6. */
  7. public class BusinessException extends RuntimeException
  8. {
  9. private static final long serialVersionUID = 3152616724785436891L;
  10. public BusinessException(String frdMessage)
  11. {
  12. super(createFriendlyErrMsg(frdMessage));
  13. }
  14. public BusinessException(Throwable throwable)
  15. {
  16. super(throwable);
  17. }
  18. public BusinessException(Throwable throwable, String frdMessage)
  19. {
  20. super(throwable);
  21. }
  22. private static String createFriendlyErrMsg(String msgBody)
  23. {
  24. String prefixStr = "抱歉,";
  25. String suffixStr = " 请稍后再试或与管理员联系!";
  26. StringBuffer friendlyErrMsg = new StringBuffer("");
  27. friendlyErrMsg.append(prefixStr);
  28. friendlyErrMsg.append(msgBody);
  29. friendlyErrMsg.append(suffixStr);
  30. return friendlyErrMsg.toString();
  31. }
  32. }

统一日志处理实现类:

[java] view plain copy

  1. package com.pilelot.web.util;
  2. import org.aopalliance.intercept.MethodInterceptor;
  3. import org.aopalliance.intercept.MethodInvocation;
  4. import org.apache.log4j.Logger;
  5. /**
  6. * Spring 统一日志处理实现类
  7. * @author Andy Chan
  8. *
  9. */
  10. public class LogInterceptor implements MethodInterceptor
  11. {
  12. public Object invoke(MethodInvocation invocation) throws Throwable
  13. {
  14. Logger loger = Logger.getLogger(invocation.getClass());
  15. loger.info("--Log By Andy Chan -----------------------------------------------------------------------------");
  16. loger.info(invocation.getMethod() + ":BEGIN!--(Andy ChanLOG)");// 方法前的操作
  17. Object obj = invocation.proceed();// 执行需要Log的方法
  18. loger.info(invocation.getMethod() + ":END!--(Andy ChanLOG)");// 方法后的操作
  19. loger.info("-------------------------------------------------------------------------------------------------");
  20. return obj;
  21. }
  22. }

Spring配置文件添加:

[html] view plain copy

  1. <!-- Spring 统一日志处理   LogInterceptor拦截器 配置 -->
  2. <bean id="logLnterceptor" class="com.pilelot.web.util.LogInterceptor"/>
  3. <!-- Spring 统一异常处理  ExceptionAdvisor配置 -->
  4. <bean id="exceptionHandler" class="com.pilelot.web.util.ExceptionAdvisor"></bean>
  5. <!-- Bean自动代理处理器 配置-->
  6. <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" >
  7. <property name="beanNames">
  8. <list>    <!-- 配置需要进行日志记录的Service和Dao -->
  9. <value>commonDao</value>
  10. <!-- 配置所有Service结尾命名的Bean,即所有Service层的类都要经过exceptionHandler异常处理类 -->
  11. <value>*Service</value>  <!-- Service层的Bean ID 命名要以Service结尾 -->
  12. </list>
  13. </property>
  14. <property name="interceptorNames">
  15. <list>
  16. <value>exceptionHandler</value>
  17. <value>logLnterceptor</value>
  18. <!--<value>transactionInterceptor</value>-->
  19. </list>
  20. </property>
  21. </bean>
  22. lt;!-- ——————————————————Spring 统一日志处理 + 统一异常处理  配置结束—————————————悲伤的分隔线—————————— -->

这样简单三步,就实现了由Spring统一日志+统一异常管理,代码清爽了不少!

时间: 2024-12-26 03:05:44

使用Spring进行统一日志管理 + 统一异常管理的相关文章

SpringMVC -- 梗概--源码--贰--异常管理

1.配置web.xml 2.配置SpringMVC.xml 3.配置控制器 4.配置异常管理器 5.配置视图 异常管理 定制异常管理器 声明 异常管理器作用

Spring MVC 中使用AOP 进行统一日志管理--XML配置实现

1.介绍 上一篇博客写了使用AOP进行统一日志管理的注解版实现,今天写一下使用XML配置实现版本,与上篇不同的是上次我们记录的Controller层日志,这次我们记录的是Service层的日志.使用的工程还是原来的那个,具体的Spring mvc 工程搭建暂不介绍.上篇记录controller层日志的时候是将切面类组件叫给spring MVC 进行管理,因为 controller 也是交给spring MVC进行管理的,但是记录service 层日志的时候应该就应该再spring 容器中进行了,

ELK统一日志管理平台第三篇-logstash grok插件的使用

1. ELK统一日志管理平台第三篇-logstash grok插件的使用   在本篇博文中,主要讲解如下几个知识点和实践经验,供大家参考:   1. 关于JAVA应用程序的日志内容标准规范:   2. 如何使用logstash的grok插件来完成message字段的拆分:   3. 定时删除Es的索引: 1. 关于JAVA应用程序的日志内容标准规范:   最近公司一直在主推ELK这个项目,而我是ELK这个项目的运维人员.所以针对ELK项目会有很多经验输出:由于我们公司的业务系统以JAVA语言开发

Logback 整合 RabbitMQ 实现统一日志输出

原文地址:Logback 整合 RabbitMQ 实现统一日志输出 博客地址:http://www.extlight.com 一.前言 公司项目做了集群实现请求分流,由于线上或多或少会出现请求失败或系统异常,为了查看失败请求的日志信息,我们得将所有服务的日志文件都打开来进行问题的定位分析,操作起来非常麻烦.因此,我们开发组决定设计一套日志查看系统来解决上述问题. 二.实现思路 默认的,应用服务日志信息会保存在本地服务器的目录中,为了方便查看日志我们应该把多台服务器日志统一输出到一个日志文件中.

JITStack统一监控平台与事态管理

事态管理(Event Management),原来称作事件管理,是ITIL运营管理体系中的一个主要流程之一.所谓Event(事态)是指对于配置项或IT服务有重要意义的状态变化.比如IT系统中的服务器.从启动状态变为关机状态.一个应用服务状态从Up到down的状态变化等等.Event一词还用于表示任何 IT 服务.配置项或监视工具创建通知.事态通常需要 IT 运营人员采取行动,并且通常导致事件记入日志.在ITIL V4中事态管理已经更新为监控与事态管理. 高效的IT服务运营有赖于对于基础设施.操作

Java项目构建基础之统一日志收集

统一日志收集 日志是追踪错误定位问题的关键,尤其在生产环境中,需要及时修复热部署,不会提供开发者debug的环境,此时日志将会是最快解决问题的关键 Logback 关于logback的配置和介绍,可以参考官网或推荐博客glmapper的logback博客,logback-spring.xml配置文件 https://blog.csdn.net/xu_san_duo/article/details/80364600 配置 以下直接贴出配置信息,介绍信息可以直接参考备注 <?xml version=

基于ActiveMQ的统一日志服务

概述 以ActiveMQ + Log4j + Spring的技术组合,实现基于消息队列的统一日志服务. 参考:Spring+Log4j+ActiveMQ实现远程记录日志——实战+分析 与参考文章的比较 1. 更新了技术的版本    e.g. Spring升级到4.2.0,ActiveMQ升级到5.13.2 2. 更新了依赖    e.g. 使用activemq-client 5.13.2替换activemq-core最高版本是5.7.0,并取消了多余的spring-jms依赖 3. 精简了配置 

spring boot 1.5.4 统一异常处理(九)

上一篇:springboot 1.5.4 配置文件详解(八) 1      Spring Boot统一异常处理 Spring Boot中实现了默认的error映射,但是在实际应用中,上面你的错误页面对用户来说并不够友好,我们通常需要去实现我们自己的异常提示. 以springboot项目为例,进行处理! springboot项目源码: https://git.oschina.net/wyait/springboot1.5.4.git 1.1  创建全局异常处理类 通过使用@ControllerAd

产品团队管理 - 统一研发环境,提效研发过程

(我本来计划将研发环境和管理流程分开来讲的,最后还是放在一起便于理解.) 软件研发最重要的场景就是在有限的时间和资源下把需求落地为产品/项目,也就是研发和项目管理,毫无疑问,这个阶段的主角是开发人员. 是不是应该多思考下怎么面向开发人员来优化整个研发过程和项目管理流程? 本文将介绍如何通过优化开发环境搭建.代码管理来提高研发过程中开发人员效率,并通过持续集成和交付让开发中的问题更早暴露,通过合理的测试反馈工具让开发人员更早定位和解决问题. 说到团队的研发和项目管理的实践,就逃不开先要说一下笔者所