当前位置: 首页 > 编程日记 > 正文

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

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

统一日志异常实现类:

[java] view plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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统一日志+统一异常管理,代码清爽了不少!

相关文章:

避免到服务器的不必要的往返过程

虽然您很可能希望尽量多地使用 Web 窗体页框架的那些节省时间和代码的功能&#xff0c;但在某些情况下却不宜使用 ASP.NET 服务器控件和回发事件处理。 通常&#xff0c;只有在检索或存储数据时&#xff0c;您才需要启动到服务器的往返过程。多数数据操作可在这些往返过程间的…

OPPO和微软合作,开放“召唤小冰”

6月24日&#xff0c;OPPO与微软共同宣布&#xff0c;OPPO手机智能助理Breeno语音开放“召唤小冰”能力一年之际&#xff0c;双方合作再次深化。微软小冰与OPPO Breeno团队加速合作&#xff0c;不断打造和更新更符合OPPO生态的AI技能&#xff0c;提升微软小冰在Breeno语音中的产…

如果你即将死去

如果你即将死去&#xff0c;你是否能够安息&#xff1b; 如果你即将死去&#xff0c;你是否还有事情不能放弃&#xff1b; 如果你即将死去&#xff0c;你的事业是否有人继续&#xff1b; 如果你即将死去&#xff0c;你的生平是否还有人惦记&#xff1b; 死亡是所有生命的终点&a…

设计模式(行为型模式)——备忘录模式(Memento)

2019独角兽企业重金招聘Python工程师标准>>> 本章讲讲第三类和第四类。 备忘录模式&#xff08;Memento&#xff09; 主要目的是保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象&#xff0c;个人觉得叫备份模式更形象些&#xff0c;通俗的讲下&#xf…

当你累了,准备放弃时,看看这个吧!!!

当你累了&#xff0c;准备放弃时&#xff0c;看看这个吧&#xff01;&#xff01;&#xff01; 在朋友空间看到这篇文章&#xff0c;送给所有还在坚持的朋友~~每个人都背负着一个沉重的十字架&#xff0c;在缓慢而艰难地朝着目的地前进。途中&#xff0c;有一个人忽然停了下来。…

只在必要时保存服务器控件视图状态

自动视图状态管理是服务器控件的功能&#xff0c;该功能使服务器控件可以在往返过程上重新填充它们的属性值&#xff08;您不需要编写任何代码&#xff09;。但是&#xff0c;因为服务器控件的视图状态在隐藏的窗体字段中往返于服务器&#xff0c;所以该功能确实会对性能产生影…

超越英伟达的,不会是另一款GPU!中国公司发布首款数据流AI芯片

2020年6月23日&#xff0c;鲲云科技在深圳举行产品发布会&#xff0c;发布全球首款数据流AI芯片CAISA&#xff0c;定位于高性能AI推理&#xff0c;已完成量产。鲲云通过自主研发的数据流技术在芯片实测算力上实现了技术突破&#xff0c;较同类产品在芯片利用率上提升了最高11.6…

vim打开多窗口、多文件之间的切换

打开多个文件&#xff1a;一、vim还没有启动的时候&#xff1a;1.在终端里输入 vim file1 file2 ... filen便可以打开所有想要打开的文件2.vim已经启动输入:e file可以再打开一个文件&#xff0c;并且此时vim里会显示出file文件的内容。3.同时显示多个文件&#xff1a;:sp …

图灵奖得主Judea Pearl:从“大数据革命”到“因果革命”

整理 | 智源社区&#xff0c;龚鹤扬&高亦斌2020年6月21日&#xff0c;在第二届北京智源大会开幕式及全体会议上&#xff0c;图灵奖得主、贝叶斯网络奠基人Judea Pearl 做了名为《The New Science of Cause and Effect with reflections on data science and artificial int…

美国两政府网站被挂马 以性丑闻女星为诱饵

据安全厂商趋势科技称&#xff0c;美国两个政府网站近日发现被挂木马&#xff0c;这两家被挂马的网站都是以性丑闻女性为诱饵欺骗用户访问其它恶意网页。  圣伯纳迪诺县的宣传页面被发现感染了恶意木马&#xff0c;用户访问该网站时被重定向到域名Videosdivx.net下的一个网站…

除非有特殊的原因要关闭缓冲,否则使其保持打开

禁用 Web 窗体页的缓冲会导致大量的性能开销。

[React Native Android安利系列]搭建React Native Android环境

欢迎大家收看react-native-android系列教程&#xff0c;跟着本系列教程学习&#xff0c;可以熟练掌握react-native-android的开发&#xff0c;你值得拥有https://segmentfault.com/blog... (PS&#xff0c;和聊一聊系列写在一起也实在是没辙&#xff0c; 谁知道如何新建专栏&am…

继承QTreeWidgetItem发生error: 'staticMetaObject' is not a member of 'QTreeWidgetItem' 错误

点击打开链接 #ifndef QQUSERITEM_H就发生下列错误 #define QQUSERITEM_H #include <QTreeWidgetItem> class QQUserItem :public QTreeWidgetItem { Q_OBJECT public: explicit QQUserItem(QQUserItem *parent 0); signals: public slots: }; #endif // QQUSERITEM_H d…

使用 HttpResponse.Write 方法进行字符串串联

该方法提供非常有效的缓冲和连接服务。但是&#xff0c;如果您正在执行广泛的连接&#xff0c;请使用多个 Response.Write 调用。下面示例中显示的技术比用对 Response.Write 方法的单个调用连接字符串更快。 [C#] Response.Write("a"); Response.Write(myString); …

倒计时 8 天 | 完整议程大揭秘!来 20 个 AI 论坛,与百名大咖携手玩转人工智能...

2020年7月3—4日&#xff0c;由 CSDN 主办的第三届 AI 开发者大会&#xff08;AI ProCon 2020&#xff09;&#xff08;大会官网&#xff1a;https://aiprocon.csdn.net/&#xff09;将以线上直播的形式与大家相见。本次大会历时2天&#xff0c;一次性设立6大主题、20大精彩分论…

关于分页的解决方案收集

分页的html样式&#xff0c;可分为两种&#xff0c;pc和移动端 pc端的解决方案&#xff08;既有json版本又有get参数版本&#xff09;&#xff1a; http://laypage.layui.com/ 移动端的上拉刷新&#xff0c;下拉加载解决方案&#xff1a;(个人建议还是老实用会iscroll.js吧) ht…

MVC3+EF4.1学习系列(一)-------创建EF4.1 code first的第一个实例(强转)

文章索引和简介 基于EF4.1 code first 简单的CRUD 园子中已经有很多了 ~~ 真不想再写这个了 可是为了做一个完整的小demo 从开始 到后面的一些简单重构 还是决定认真把这个写出来 争取写些别人没写到的东西~~ 好了 开始~~ 这次要做的是个学校管理的demo&#xff08;通俗些&…

超越英伟达的,不会是另一款GPU?这家深圳公司发布全球首款数据流AI芯片

2020年6月23日&#xff0c;鲲云科技在深圳举行产品发布会&#xff0c;发布全球首款数据流AI芯片CAISA&#xff0c;定位于高性能AI推理&#xff0c;已完成量产。鲲云通过自主研发的数据流技术在芯片实测算力上实现了技术突破&#xff0c;较同类产品在芯片利用率上提升了最高11.6…

不要依赖代码中的异常

因为异常大大地降低性能&#xff0c;所以您不应该将它们用作控制正常程序流程的方式。如果有可能检测到代码中可能导致异常的状态&#xff0c;请执行这种操作。不要在处理该状态之前捕获异常本身。常见的方案包括&#xff1a;检查 null&#xff0c;分配给将分析为数字值的 Stri…

MySQL5.7配置日志

之前使用MySQL 5.1版本的时候&#xff0c;修改my.cnf&#xff0c;在[mysqld]下添加"log/data/mysql/query.log"&#xff0c;重启服务就ok了 但是在5.7会出现 Starting MySQL... ERROR! The server quit without updating PID file (/data/mysql/mysql.pid).原因是5.7…

Linux下新增硬盘处理过程

1、Linux的硬盘识别  在/dev/下建立相应的设备文件。如  sda 表示第一块SCSI硬盘  hda 表示第一块IDE硬盘&#xff08;即连接在第一个IDE接口的Master口上&#xff09;  scd0 表示第一个USB光驱  通过fdisk -l 查看当前的设备和分区信息。注意&#xff0c;新硬盘没有…

FastSpeech语音合成系统技术升级,微软联合浙大提出FastSpeech2

来源 | 微软研究院AI头条&#xff08;ID: MSRAsia&#xff09;编者按&#xff1a;基于深度学习的端到端语音合成技术进展显著&#xff0c;但经典自回归模型存在生成速度慢、稳定性和可控性差的问题。去年&#xff0c;微软亚洲研究院和微软 Azure 语音团队联合浙江大学提出了快速…

如果有大型 Web 应用程序,可考虑执行预批编译

每当发生对目录的第一次请求时都会执行批编译。如果目录中的页面没有被分析并编译&#xff0c;此功能会成批分析并编译目录中的所有页面&#xff0c;以便更好地利用磁盘和内存。如果这需要很长时间&#xff0c;则将快速分析并编译单个页面&#xff0c;以便请求能被处理。此功能…

深入理解javascript函数系列第二篇——函数参数

前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同。函数不介意传递进来多少个参数&#xff0c;也不在乎传进来的参数是什么数据类型&#xff0c;甚至可以不传参数。本文是深入理解javascript函数系列第二篇——函数参数 arguments javascript中的函数定义并…

linux下如何查看某个软件 是否安装??? 安装路径在哪???

<1>.在linux下如何判断是否已经安装某个软件&#xff1f; 我的系统是red hat我用命令rpm查是否安装了某个软件&#xff08;例如&#xff1a; matlab 与 fluent &#xff09;&#xff0c;得到了如下的结果&#xff1a;我用rpm -qa &#xff08;| grep&#xff09; matlab …

适当地使用公共语言运行库的垃圾回收器和自动内存管理

小心不要给每个请求分配过多内存&#xff0c;因为这样垃圾回收器将必须更频繁地进行更多的工作。另外&#xff0c;不要让不必要的指针指向对象&#xff0c;因为它们将使对象保持活动状态&#xff0c;并且应尽量避免含 Finalize 方法的对象&#xff0c;因为它们在后面会导致更多…

AI又进阶!除了鉴别PS图片,还能一键卸妆

作者 | 马超编辑 | 伍杏玲封图 | 视觉中国出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;最近CVPR2020的论文集合在GitHub火了&#xff0c;CVPR2020-Paper- Code 的项目&#xff08;https://github.com/extreme-assistant/CVPR2020-Paper-Code-Interpretation&#…

[转]Git忽略规则及.gitignore规则不生效的解决办法

在git中如果想忽略掉某个文件&#xff0c;不让这个文件提交到版本库中&#xff0c;可以使用修改根目录中 .gitignore 文件的方法&#xff08;如无&#xff0c;则需自己手工建立此文件&#xff09;。这个文件每一行保存了一个匹配的规则例如&#xff1a; # 此为注释 – 将被 Git…

改善代码设计 —— 简化条件表达式(Simplifying Conditional Expressions)

系列博客 1. 改善代码设计 —— 优化函数的构成(Composing Methods) 2. 改善代码设计 —— 优化物件之间的特性(Moving Features Between Objects) 3. 改善代码设计 —— 组织好你的数据(Composing Data) 4. 改善代码设计 —— 简化条件表达式(Simplifying Conditional Express…

必要时调整应用程序每个辅助进程的线程数

ASP.NET 的请求结构试图在执行请求的线程数和可用资源之间达到一种平衡。已知一个使用足够 CPU 功率的应用程序&#xff0c;该结构将根据可用于请求的 CPU 功率&#xff0c;来决定允许同时执行的请求数。这项技术称作线程门控。但是在某些条件下&#xff0c;线程门控算法不是很…