异常日志处理-ThrowsAdvice

  有的时候,为了保全代码的简洁,我们不希望在程序中看到一些跟程序逻辑的代码,譬如异常日志打印,这个时候就需要我们对程序中的异常日志进行统一的管理。spring aop 可以在不破坏程序逻辑的情况下很好的完成我们上面的需求。本文对对日志的处理使用到了ThrowsAdvice接口和spring aop

ThrowsAdvice接口

 1 /*
 2  * Copyright 2002-2008 the original author or authors.
 3  *
 4  * Licensed under the Apache License, Version 2.0 (the "License");
 5  * you may not use this file except in compliance with the License.
 6  * You may obtain a copy of the License at
 7  *
 8  *      http://www.apache.org/licenses/LICENSE-2.0
 9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.springframework.aop;
18
19 /**
20  * Tag interface for throws advice.
21  *
22  * <p>There are not any methods on this interface, as methods are invoked by
23  * reflection. Implementing classes must implement methods of the form:
24  *
25  * <pre class="code">void afterThrowing([Method, args, target], ThrowableSubclass);</pre>
26  *
27  * <p>Some examples of valid methods would be:
28  *
29  * <pre class="code">public void afterThrowing(Exception ex)</pre>
30  * <pre class="code">public void afterThrowing(RemoteException)</pre>
31  * <pre class="code">public void afterThrowing(Method method, Object[] args, Object target, Exception ex)</pre>
32  * <pre class="code">public void afterThrowing(Method method, Object[] args, Object target, ServletException ex)</pre>
33  *
34  * The first three arguments are optional, and only useful if we want further
35  * information about the joinpoint, as in AspectJ <b>after-throwing</b> advice.
36  *
37  * <p><b>Note:</b> If a throws-advice method throws an exception itself, it will
38  * override the original exception (i.e. change the exception thrown to the user).
39  * The overriding exception will typically be a RuntimeException; this is compatible
40  * with any method signature. However, if a throws-advice method throws a checked
41  * exception, it will have to match the declared exceptions of the target method
42  * and is hence to some degree coupled to specific target method signatures.
43  * <b>Do not throw an undeclared checked exception that is incompatible with
44  * the target method‘s signature!</b>
45  *
46  * @author Rod Johnson
47  * @author Juergen Hoeller
48  * @see AfterReturningAdvice
49  * @see MethodBeforeAdvice
50  */
51 public interface ThrowsAdvice extends AfterAdvice {
52
53 }

看接口说明可知,该接口上没有任何方法,但是实现了这个接口的类必须至少实现以下4个方法中的一个,否则程序报:

Caused by: java.lang.IllegalArgumentException: At least one handler method must be found in class

接口中的异常类可以为自己自定义的异常类,方法是通过反射调用。

1 public void afterThrowing(Exception ex)
2 public void afterThrowing(RemoteException)
3 public void afterThrowing(Method method, Object[] args, Object target, Exception ex)
4 public void afterThrowing(Method method, Object[] args, Object target, ServletException ex)

自定义异常类

 1 package com.apt.study.exception;
 2
 3 public class StudyException extends RuntimeException {
 4
 5     /**
 6      *
 7      */
 8     private static final long serialVersionUID = -6183216129830888521L;
 9
10     /**
11      * 异常信息
12      */
13     protected String message;
14
15     /**
16      * 异常编码
17      */
18     protected int code;
19
20     public static final StudyException PARAM_VALIDATE_EXCEPTION = new StudyException(1234,"参数校验出错");
21
22     public StudyException(int code, String msgFormat, Object... args) {
23         super(String.format(msgFormat, args));
24         this.code = code;
25         this.message = String.format(msgFormat, args);
26     }
27
28     public StudyException(String message, Throwable cause) {
29         super(message, cause);
30     }
31
32     public StudyException(Throwable cause) {
33         super(cause);
34     }
35
36     public StudyException(String message) {
37         super(message);
38     }
39
40     public String getMessage() {
41         return message;
42     }
43
44     public void setMessage(String message) {
45         this.message = message;
46     }
47
48     public int getCode() {
49         return code;
50     }
51
52     public void setCode(int code) {
53         this.code = code;
54     }
55
56
57 }

异常日志处理类

 1 package com.apt.study.exception;
 2
 3 import java.lang.reflect.Method;
 4
 5 import org.slf4j.Logger;
 6 import org.slf4j.LoggerFactory;
 7 import org.springframework.aop.ThrowsAdvice;
 8
 9 public class ExceptionLogHandler implements ThrowsAdvice{
10
11     public Logger logger = LoggerFactory.getLogger(ExceptionLogHandler.class);
12
13     public void afterThrowing(Method method, Object[] args, Object target, StudyException ex) {
14         logger.error("ExceptionLogHandler--StudyExcception");
15         logger.info("-------errCode:" + ex.getCode() + "; errMessage:" + ex.getMessage());
16         errorClassInfo(ex);
17         logger.info("-------" + ex.fillInStackTrace());
18     }
19
20     public void afterThrowing(Method method, Object[] args, Object target, Exception ex) {
21
22         logger.error("ExceptionLogHandler--Exception");
23         logger.error("------->Erro Class: "+ target.getClass().getName());
24         logger.error("------->Error method:"+ method.getName());
25
26         if(args != null) {
27             for(int i=0; i<args.length; i++) {
28                 logger.error("------->args[" + i + "]: " + args[i]);
29             }
30         }
31
32         logger.error("------->Exception class: " + ex.getClass().getName());
33         errorClassInfo(ex);
34         logger.error("------->" + ex.fillInStackTrace());
35     }
36
37     //打印抛出异常地方的信息
38     private void errorClassInfo(Exception ex) {
39         /*
40          * ex.getStackTrace()返回堆栈跟踪元素的数组,每个元素表示一个堆栈帧。数组的第零个元素(假定数据的长度为非零)表示堆栈顶部,
41          * 它是序列中最后的方法调用。
42          * 通常,这是创建和抛出该 throwable 的地方。数组的最后元素(假定数据的长度为非零)表示堆栈底部,它是序列中第一个方法调用
43          */
44         StackTraceElement[] stackTraceElementArr= ex.getStackTrace();
45         StackTraceElement stackTraceElement = stackTraceElementArr[0];
46         logger.error("------->Erro File:" + stackTraceElement.getFileName());
47         logger.error("------->Erro Method:" + stackTraceElement.getMethodName());
48         logger.error("------->Erro Line:" + stackTraceElement.getLineNumber());
49     }
50
51 }

spring-context.xml 配置

<!-- 异常信息 拦截 -->
     <bean id="exceptionLog" class="com.apt.study.exception.ExceptionLogHandler"></bean>
     <aop:config>
        <aop:pointcut id="exceptionTrade" expression="execution(* com.apt.study.service.*.*(..))" />
        <aop:advisor pointcut-ref="exceptionTrade" advice-ref="exceptionLog"/>
    </aop:config>
时间: 2024-12-17 06:41:33

异常日志处理-ThrowsAdvice的相关文章

angular代码设计之异常日志设计

angular代码分析之异常日志设计 错误异常是面向对象开发中的记录提示程序执行问题的一种重要机制,在程序执行发生问题的条件下,异常会在中断程序执行,同时会沿着代码的执行路径一步一步的向上抛出异常,最终会由顶层抛出异常信息.而与异常同时出现的往往是日志,而日志往往需要记录具体发生异常的模块.编码.详细的错误信息.执行堆栈等,方便问题的快速定位分析.angularjs作为前端的框架,其对异常信息的处理是怎样的呢? 一.定义模块和异常类型 首先每个模块的日志模块编码是一样的,只需要本模块负责初始化一

ASP.NET全局错误处理和异常日志记录以及IIS配置自定义错误页面

应用场景和使用目的 很多时候,我们在访问页面的时候,由于程序异常.系统崩溃会导致出现黄页.在通常的情况下,黄页对于我们来说,帮助是极大的,因为它可以帮助我们知道问题根源,甚至是哪一行代码出现了错误.但这对于用户是非常可怕的,因为用户不知道发生了什么,也无法了解黄页给出的内容.甚至,如果我们遇到一些不友好的人,他们会拿这些内容大做文章,对我们网站产生威胁. 那我们如何在程序异常.系统崩溃时,不会出现黄页,并且还可以给出一些更加友好的提示呢?甚至在我们需要的时候,可以收集这些异常信息,并加以分析,能

日志分析(六)业务异常日志分解

1.初步分离 业务系统在运行期间会抛出来一些运行期异常日志,监控这些日志,过滤多余其它日志,然后给予相应owner告警就成为异常监控的目标之一. logstash配置如下: input {file { type => "exception" path => "/Users/xxxxx/Documents/xxxxx/apache-tomcat-7.0.53/bin/logs/*.log" } } filter {if ([message] =~ &quo

转:使用log4net完成程序异常日志记录(使用SQLite数据库记录和普通文本记录)

http://www.cnblogs.com/kyo-yo/archive/2010/06/11/use-log4net-to-log-exception.html 在前端时间开发的时候由于需要将异常保存到数据库中,所以就到网上搜了下专门的日志记录工具,一搜果然很多,比如:log4net,NLog,EntLib Logging等等,但是还是log4net名气最大,所以就下载下来试用了一番,果然很方便,其涵盖了所有常用的日志记录方式具体的可以看下表: AdoNetAppender 将日志记录到数据

11 异常, 日志, 断言和调试

处理异常 java程序设计中, 异常对象都是派生于Throwable类的一个实例, 如果java中内置的异常类不能够满足要求, 用户可以自己创建自己的异常类. Error 类层次结构描述了java运行时系统的内部错误和资源耗尽错误. 应用程序不应该抛出这种类型的对象, 如果出现了内部错误, 除了通知用户, 并尽力使程序安全地终止之外, 也没无能为力了, 这种情况很少出现. 需要主要关注的是 Exception层次结构, 这个层次结构分为两个分支: 有程序错误导致的异常属于 RuntimeExce

[转载]针对IIS7以上的ASP.NET网站自定义错误页面与异常日志总结

针对IIS7以上的ASP.NET网站自定义错误页面与异常日志总结 汪宇杰 2014-1-11 星期六 02:31 455 Reads 1 Comments 自定义错误页面和异常记录是个很古老的话题了,但依旧可以让人爆到现在.在我做了无数次试验并总结经验和原则后,写下本文,已警后人. 本文的范围和限制 本文仅仅适用于部署在IIS7或以上版本中的ASP.NET 4.0集成模式应用程序.IIS7以上的意思是Windows Server 2008以上服务器适用.我已在WS2012R2,IIS8上测过.

Log4Net异常日志记录在asp.net mvc3.0的应用

前言 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是简单的介绍如何在Visual Studio2010(Asp.Net Mvc3.0)中使用log4net快速创建系统日志,如何扩展以输出自定义字段. 用户可以从http://logging.apache.org/log4net/下载log4net的源代码.解压软件包后,在解压的src目录下将log4net.sln载入Visual

点评阿里JAVA手册之异常日志(异常处理 日志规约 )

下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:异常处理 日志规约 本文难度系数为一星(★) 本文为第三篇 第一篇 点评阿里JAVA手册之编程规约(命名风格.常量定义.代码风格.控制语句.注释规约) 第二篇 点评阿里JAVA手册之编程规约(OOP 规约 .集合处理 .并发处理 .其他) 码出高效.码出质量. 代码的字里行间流淌的是软件生命中的血液,质量的提升是尽可能少踩坑,杜绝踩重复的坑,切实提升质量意识

在 C# 控制台中记录异常日志并输出

最近做了一个小程序,要求在控制台中记录程序运行的异常并输出到指定的文件夹中,以下是我的具体的程序代码: public static void ErrorLog(Exception ex) { string FilePath = "/ErrorLog.txt"; StringBuilder msg = new StringBuilder (); msg.Append("*************************************** \n"); msg.