Spring + Aop+注解 集成使用 Log4j,实现异常日志记录

A,首先说,如何配置:

1,在web.xml中添加代码:

<!-- log4j的配置相关 -->

<context-param>

<param-name>log4jConfigLocation</param-name>

<param-value>classpath:config/log4j/log4j.properties</param-value>

</context-param>

<context-param>

<param-name>log4jRefreshInterval</param-name>

<param-value>6000000</param-value>

</context-param>

<listener>

<listener-class>

org.springframework.web.util.Log4jConfigListener

</listener-class>

</listener>

<!-- end -->

2,classpath:config/log4j/log4j.properties配置文件如下:

### set log levels ###

log4j.rootLogger = WARN ,  stdout ,  D ,  E

### \u8F93\u51FA\u5230\u63A7\u5236\u53F0 ###

log4j.appender.stdout = org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Target = System.out

log4j.appender.stdout.layout = org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}   [ %p ]  %m%n

### \u8F93\u51FA\u5230\u65E5\u5FD7\u6587\u4EF6 ###

log4j.appender.D = org.apache.log4j.DailyRollingFileAppender

#log4j.appender.D.File = D://WARN_log.log

log4j.appender.D.File = /mnt/soft/tomcat/common_logs/tomcat_6082_Warn_log.log

log4j.appender.D.Append = true

log4j.appender.D.Encoding=UTF-8

log4j.appender.D.Threshold = WARN

log4j.appender.D.layout = org.apache.log4j.PatternLayout

log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %p ]  %m%n

### \u4FDD\u5B58\u5F02\u5E38\u4FE1\u606F\u5230\u5355\u72EC\u6587\u4EF6 ###

log4j.appender.E = org.apache.log4j.DailyRollingFileAppender

#log4j.appender.E.File = D://error_log.log

log4j.appender.E.File = /mnt/soft/tomcat/common_logs/tomcat_6082_Error_log.log

log4j.appender.E.Append = true

log4j.appender.E.Encoding=UTF-8

log4j.appender.E.Threshold = ERROR

log4j.appender.E.layout = org.apache.log4j.PatternLayout

log4j.appender.E.layout.ConversionPattern =%-d{yyyy-MM-dd HH:mm:ss}   [ %p ]  %m%n

具体的参数含义,参考:http://blog.csdn.net/azheng270/article/details/2173430/

B,其次,如何配合注解和Aop,实现  异常日志记录:

1,自定义注解:

@Documented

@Inherited

@Target({ElementType.PARAMETER, ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

public  @interface ServiceExceptionLog {

String description()  default "异常信息";

}

2,自定义一个切面类,并使用:

package com.sxb.web.common.aop;

import org.apache.log4j.Logger;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.annotation.*;

import org.springframework.stereotype.Component;

import com.google.gson.Gson;

import com.sxb.web.common.interceptor.annotate.ServiceExceptionLog;

import java.lang.reflect.Method;

/**

* 切点类

* @author tiangai

* @since 2014-08-05 Pm 20:35

* @version 1.0

*/

@Aspect

@Component

public  class ServiceExceptionLogAspect {

//本地异常日志记录对象

private  static  final Logger logger = Logger.getLogger(ServiceExceptionLogAspect.class.getName());

//Service层切点

@Pointcut("execution(* com.sxb.web.v2.wh.service.impl.*.*(..))")

public void serviceAspect() {

}

/**

* 异常通知 用于拦截service层记录异常日志

*

* @param joinPoint

* @param e

* @throws Exception

*/

@AfterThrowing(pointcut = "serviceAspect()", throwing = "e")

public  void doAfterThrowing(JoinPoint joinPoint, Throwable e) throws Exception {

//     HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

//        HttpSession session = request.getSession();

//获取用户请求方法的参数并序列化为JSON格式字符串

String params = "";

if (joinPoint.getArgs() !=  null && joinPoint.getArgs().length > 0) {

for ( int i = 0; i < joinPoint.getArgs().length; i++) {

params += new Gson().toJson(joinPoint.getArgs()[i]) + ";";

}

}

StringBuilder bd = new StringBuilder();

bd.append("异常方法相关信息:"+getServiceMthodDescription(joinPoint)).append("    ###  ").

append("异常代码:"+e.getClass().getName()).append("    ###   ")

.append("异常信息:"+e.getMessage()).append("    ###   ")

.append("参数:"+params);

logger.error(bd.toString());

}

/**

* 获取注解中对方法的描述信息 用于service层注解

*

* @param joinPoint 切点

* @return 方法描述

* @throws Exception

*/

public  static String getServiceMthodDescription(JoinPoint joinPoint)

throws Exception {

String targetName = joinPoint.getTarget().getClass().getName();

String methodName = joinPoint.getSignature().getName();

Object[] arguments = joinPoint.getArgs();

Class targetClass = Class.forName(targetName);

Method[] methods = targetClass.getMethods();

String description = "异常类是:"+targetName+" ;异常方法名称:"+methodName+" ;异常描述信息:";

for (Method method : methods) {

if (method.getName().equals(methodName)) {

Class[] clazzs = method.getParameterTypes();

if (clazzs.length == arguments.length) {

description += method.getAnnotation(ServiceExceptionLog.class).description();

break;

}

}

}

return description;

}

}

3,给一个Service方法添加异常日志记录注解:

@ServiceExceptionLog(description="--自定义异常描述---")

public  void test(String str)     {

int aa =12/0;

}

时间: 2024-12-08 01:19:12

Spring + Aop+注解 集成使用 Log4j,实现异常日志记录的相关文章

Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解

原创整理不易,转载请注明出处:Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解 代码下载地址:http://www.zuidaima.com/share/1772661373422592.htm 本文介绍了使用Spring注解注入属性的方法.使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifi

Spring AOP 注解配置实例

Spring AOP注解例子 一:导入相关jar包. 首先导入Spring的相关包(这里就不多说了,我这里是3.2.4版本的) 然后导入AOP注解的相关包(不是spring的包)aspectjrt-1.6.7.jar和aspectjweaver-1.6.8.jar和aopalliance.jar (注意这里最好是1.6.7以上的版本,不然容易出错,折腾了我好久,最后才发现是包的版本问题. 所以这里一定要注意,spring 2.0以后的最好是用1.6.7的版本) 二: 建一个class类作为切入面

Spring AOP注解方式实现

简介 上文已经提到了Spring AOP的概念以及简单的静态代理.动态代理简单示例,链接地址:https://www.cnblogs.com/chenzhaoren/p/9959596.html 本文将介绍Spring AOP的常用注解以及注解形式实现动态代理的简单示例. 常用注解 @aspect:定义切面 @pointcut:定义切点 @Before:前置通知,在方法执行之前执行 @After:后置通知,在方法执行之后执行 @AfterRunning:返回通知,在方法返回结果之后执行 @Aft

redis队列结合log4net实现异常日志记录

查看了一些关于mvc异常日志记录的文章,发现使用redis+log4net的最多,这里简单总结了使用这种方式实现日志记录的过程.直接上步骤: 第一步:配置redis服务器 参考redis的配置和在.net中的使用 第二步:添加自己的异常过滤器(Models文件夹添加一个MyExceptionAttribute类) 1 public class MyExceptionAttribute : HandleErrorAttribute 2 { 3 //----所有用户出现异常,向同一个静态队列添加数据

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

spring Aop 注解

个人理解: spring Aop 是什么:面向切面编程,类似于自定义拦截操作,支持拦截之前操作@Before,拦截之后操作@After,拦截环绕操作@Around. 什么情况下使用spring Aop:举例如下 当需要统计某些方法 or 指定xx开头的方法名 or 指定xx结尾的方法名 or 某些类下的方法 or 某些包下的方法 or 所有的方法的耗时统计或添加日志信息时,使用spring Aop 切面编程可以不用修改任何需要统计或添加日志的方法,只需很少一部分代码实现需要做的操作. 某交易系统

spring AOP注解实现

一.什么是AOP 引用一下维基百科的定义 面向切面的程序设计(Aspect-oriented programming,AOP,又译作面向方面的程序设计.剖面导向程序设计)是计算机科学中的一种程序设计思想,旨在将横切关注点与业务主体进行进一步分离,以提高程序代码的模块化程度.通过在现有代码基础上增加额外的通知(Advice)机制,能够对被声明为"切点(Pointcut)"的代码块进行统一管理与装饰,如"对所有方法名以'set*'开头的方法添加后台日志".该思想使得开发

转:Spring AOP 注解方式实现的一些“坑”

使用过Spring AOP的注解方式实现,也入过不少坑,现在做一下记录,希望有同样需求的朋友可以少走弯路 使用之前还是先过一下官方文档吧,至少可以少走弯路,不用担心英文读不懂,其实只看代码例子就能理解很多问题! 1. SpringBoot如何获得Aspect支持? 看这里:Spring Boot 开启AOP的方法 2. 我按照上面的方法开启了AOP支持,为什么始终是不走切入点方法呢? 首先仔细检查一下,Aspect类是不是少了@Component注解(这一点很重要!),只有一个@Aspect注解

日志异常处理-spring aop注解

spring aop 可以在不破坏我们程序代码的前提下很好的对程序异常进行打印,网上也有很多这样的例子,我这里写的比较简单,只是针对程序出异常时进行见到的日志打印,代码比较简单. 异常日志处理类 package com.apt.study.exception; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation