`

采用AOP+log4j记录项目日志

 
阅读更多

关于AOP,我之前对AOP和OOP进行过对比Spring——闲扯AOP与OOP,在宏观上对AOP部分知识有了一个较清晰的了解。但是AOP的应用只在声明式事务处理时用过。还不能够对AOP进行灵活运用。人尽言AOP是OOP的补充,下面就通过AOP处理log4j记录日志的例子,学习AOP。

 

首先,AOP处理日志是必需的,不使用AOP处理日志有诸多不便。

日志处理是每个项目当中一个非常重要的内容。没有了日志,也就失去了对系统的可控性。没有日志,系统出现任何问题,都会没有踪迹可寻,这对一个信息系统而言是非常危险的。

然而,使用纯OOP思想进行日志处理,我们会发现,每个逻辑部分中总会混入日志处理的代码,导致纯OOP思想的设计略显不伦不类。同时,如果记录日志的类型需求有变更,那么我们就要去每个逻辑单元中修改Java代码。另外,如果需求今天变了明天再变的话,我想这将是一个非常繁重并且惹人厌的工作。

其实日志处理应该是软件系统中单独的一大部分,开发人员在进行系统开发时,不应该再来考虑日志处理。AOP能够做到这一点,让开发人员更加专注于系统的业务编码,而无需顾虑日志问题(这一点大家可以联系声明式事务处理的方式,配置好了处理事务的配置文件,编写Manager或者action时,都无需顾虑事务)。

 

然后,介绍例子中的代码实现。

1、引入jar包:

               

 

2、切面Aspect代码:

 

  1. package com.lzq.spring.aop;  
  2.   
  3. import org.apache.log4j.Logger;  
  4. import org.aspectj.lang.JoinPoint;  
  5. import org.aspectj.lang.ProceedingJoinPoint;  
  6. import com.lzq.spring.test.AOPTest;  
  7. /** 
  8.  * 切面 
  9.  * @author lzq 
  10.  * 
  11.  */  
  12. public class Aspect {  
  13.       
  14.     Logger logger = Logger.getLogger(AOPTest.class);  
  15.     String strLog = null ;  
  16.       
  17.     /** 
  18.      * 前置通知:在某连接点之前执行的通知,但这个通知不能阻止连接点前的执行 
  19.      * @param jp 连接点:程序执行过程中的某一行为,例如,AServiceImpl.barA()的调用或者抛出的异常行为 
  20.      */  
  21.     public void doBefore(JoinPoint jp) {  
  22.         strLog = "log Begining method: "  
  23.                 + jp.getTarget().getClass().getName() + "."  
  24.                 + jp.getSignature().getName();  
  25.         logger.warn(strLog);  
  26.     }  
  27.     /** 
  28.      * 环绕通知:包围一个连接点的通知,可以在方法的调用前后完成自定义的行为,也可以选择不执行 
  29.      * 类似Web中Servlet规范中的Filter的doFilter方法。 
  30.      * @param pjp 当前进程中的连接点 
  31.      * @return 
  32.      * @throws Throwable 
  33.      */  
  34.     public Object doAround(ProceedingJoinPoint pjp) throws Throwable {  
  35.         long time = System.currentTimeMillis();  
  36.         Object retVal = pjp.proceed();  
  37.         time = System.currentTimeMillis() - time;  
  38.         System.out.println("process time: " + time + " ms");  
  39.         return retVal;  
  40.     }  
  41.     /** 
  42.      * 抛出异常后通知 : 在方法抛出异常退出时执行的通知。 
  43.      * @param jp 连接点:程序执行过程中的某一行为,例如,AServiceImpl.barA()的调用或者抛出的异常行为 
  44.      */  
  45.     public void doAfter(JoinPoint jp) {  
  46.         strLog ="doAfter:log Ending method: "  
  47.                 + jp.getTarget().getClass().getName() + "."  
  48.                 + jp.getSignature().getName();   
  49.         logger.warn(strLog);  
  50.     }  
  51. }  

 

3、业务代码:

业务逻辑接口:

 

  1. package com.lzq.spring.service;  
  2.   
  3. /** 
  4.  * 接口 AService 
  5.  */  
  6. public interface AService {  
  7.     public void cool(String _msg);  
  8.     public void cool();  
  9. }  

 

业务接口的实现:

 

  1. package com.lzq.spring.service;  
  2.   
  3. /** 
  4.  * 接口的实现 
  5.  * @author lzq 
  6.  * 
  7.  */  
  8. public class AServiceImpl implements AService {  
  9.     @Override  
  10.     public void cool() {  
  11.         System.out.println("哇,楼主好帅!");   
  12.     }  
  13.     @Override  
  14.     public void cool(String name) {  
  15.         System.out.println("哇,楼主"+name+",你好帅啊!");  
  16.     }  
  17. }  

 

4、测试AOPTest:

 

  1. package com.lzq.spring.test;  
  2.   
  3. import org.springframework.beans.factory.BeanFactory;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5. import com.lzq.spring.service.AService;  
  6.   
  7. public class AOPTest{  
  8.     public static void main(String[] args){  
  9.         BeanFactory factory = new ClassPathXmlApplicationContext("ApplicationContext.xml");  
  10.         AService aService = (AService)factory.getBean("aService");  
  11.         aService.cool();  
  12.         aService.cool("泉浴五江");  
  13.     }  
  14. }  

 

5、Spring配置文件ApplicationContext.xml:

 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:aop="http://www.springframework.org/schema/aop"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
  6.         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"   
  7.             default-autowire="autodetect">  
  8.      <aop:config>    
  9.         <aop:aspect id="aspect" ref="aspectBean">    
  10.             <!--配置com.lzq.spring.service包下所有类或接口的所有方法-->    
  11.             <aop:pointcut id="logService"    
  12.                 expression="execution(* com.lzq.spring.service.*.*(..))" />    
  13.             <aop:before pointcut-ref="logService" method="doBefore"/>    
  14.             <aop:after pointcut-ref="logService" method="doAfter"/>    
  15.             <aop:around pointcut-ref="logService" method="doAround"/>    
  16.         </aop:aspect>    
  17.     </aop:config>    
  18.     <bean id="aspectBean" class="com.lzq.spring.aop.Aspect" />    
  19.     <bean id="aService" class="com.lzq.spring.service.AServiceImpl" />    
  20. </beans>  

 

6、log4j的properties文件主要配置:

 

[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
 
  1. ### direct log messages to stdout ###  
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  3. log4j.appender.stdout.Target=System.out  
  4. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  5. log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n  
  6.   
  7. log4j.appender.file=org.apache.log4j.FileAppender  
  8. log4j.appender.file.File=d:/test_log.log  
  9. log4j.appender.file.layout=org.apache.log4j.PatternLayout  
  10. log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n  
  11. log4j.rootLogger=warn, stdout,file  
  12. log4j.logger.org.hibernate.type=info  
  13. log4j.logger.org.hibernate.tool.hbm2ddl=debug  
  14. com.lzq.spring.service = debug  


 

7、显示结果:

Console窗口

文件位置:

日志文件内容:

 

8、源码下载:http://download.csdn.net/detail/liu765023051/6307585

分享到:
评论

相关推荐

    ssh+aop+log4j+日志拦截器+注解

    标题中的"ssh+aop+log4j+日志拦截器+注解"涉及到的是Java Web开发中的几个核心组件和技术,这些技术在构建大型、分布式的企业级应用时常常被使用。下面将详细介绍这些知识点: 1. SSH (Spring, Struts, Hibernate)...

    Spring Aop+Log4j 动态日志

    在IT行业中,Spring AOP(面向切面编程)和Log4j是两个非常重要的工具,它们在实际开发中起着至关重要...读者可以通过学习这些材料,更深入地理解Spring AOP和Log4j的结合使用,以及如何在实际项目中应用动态日志功能。

    AOP+log4j记录日志

    AOP能够做到这一点,让开发人员更加专注于系统的业务编码,而无需顾虑日志问题(这一点大家可以联系声明式事务处理的方式,配置好了处理事务的配置文件,编写Manager或者action时,都无需顾虑事务)

    springBoot+aop+自定义注解+本地线程实现统一接口日志及接口响应时长

    内容概要:springboot+拦截器+aop+自定义注解+本地线程实现统一接口日志记录,记录下接口所在模块、接口描述、接口请求参数、接口返回参数、接口请求时间以及接口耗时用于接口优化,接口记录参数以及操作人防止使用...

    aop+swagger,拦截记录日志功能

    aop+swagger,拦截记录日志功能,博客会有详细描述

    springmvc中使用log4j及aop记录日志的例子

    在这个例子中,我们将讨论如何将Log4j与Spring MVC和AOP结合,实现方法调用前后的日志打印。 首先,让我们了解Log4j的基本配置。Log4j的配置文件通常是`log4j.properties`或`log4j.xml`,定义了日志的级别(如DEBUG...

    spring简单注解+log4j记录日志

    在项目中配置Log4j,通常需要一个配置文件(如log4j.properties或log4j.xml),定义日志输出的格式、级别和目标。例如,通过以下配置可以将日志信息写入名为"app.log"的文件: ```properties # log4j.properties ...

    SpringBoot+AOP+TraceID.pdf

    SpringBoot+AOP+TraceID.pdf 本文档主要讲解了 SpringBoot 中 AOP(Aspect Oriented Programming)的应用和 TraceID 的实现。 AOP 基本概念 AOP 的 existence 目的是为了解耦,使得一组类可以共享相同的行为。在 ...

    基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)

    基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)...

    spring+springmvc+mybatis+log4j+springtest的demo

    这是一个基于Java技术栈的Web应用示例项目,主要采用了Spring、SpringMVC、MyBatis、Log4j和SpringTest等组件。以下是这些技术及其在项目中的应用详解: 1. **Spring**:Spring是一个全面的Java企业级应用开发框架...

    aop-log-annotation:基于Log4j+SpringAOP+Annotation的可注解日志切面组件

    基于Log4j+SpringAOP+Annotation的可注解日志切面组件 使用方式 @Log(logAfter = true, logBefore = true) public returntype methodName(params) 测试类com.liam.aop.aspect.test.AopLogAnnotationTest 测试输出 ...

    Spring mvc Aop+annotation实现系统日志记录功能实现的jar包

    Spring mvc Aop+annotation实现系统日志记录功能实现的jar包asm-3.3.jar ,aspectjrt.jar , aspectjweaver.jar , cglib-nodep-2.1_3.jar , spring-aop.jar

    Spring.net + MVC + EF + EasyUI + Log4net

    5. **Log4net**:这是Apache的一个日志记录工具,适用于.NET平台。它提供了一种灵活的方式来控制日志记录,包括选择日志输出目的地(如文件、控制台、数据库等),定义日志格式,以及控制日志级别等,对于调试和监控...

    spring mvc +mysql+log4j+aop

    综上,这个项目涵盖了Spring MVC作为web应用的核心框架,利用MySQL存储和处理数据,Log4j实现日志记录,AOP增强Controller的功能,DRUID作为高效的数据库连接池,以及对旧版浏览器的兼容性处理。对于初学者来说,这...

    spring+springMVC+mybatis+log4j框架整合

    本文将深入探讨这些框架的集成以及log4j日志系统的应用。 首先,Spring框架作为核心,它提供了依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)等功能,有助于简化应用的...

    aop+exception的测试代码

    在本案例中,"aop+exception"的测试代码可能涉及到如何在Spring框架中使用AOP来处理异常。 首先,让我们深入了解一下AOP。Spring AOP是Spring框架的一个重要组成部分,它允许开发者定义“切面”,即跨越多个对象的...

    Hibernate4+SpringMVC+Junit4+log4j环境搭建Jar包

    在项目中,你需要包含log4j.jar,并配置log4j.properties或log4j.xml来定义日志策略。 **环境搭建步骤:** 1. 创建Java Web项目,导入上述提到的所有jar包。 2. 配置SpringMVC的DispatcherServlet,并设置servlet-...

    Spring AOP + SpringMVC +Mybatis做动态数据源,实现读写分离

    Spring AOP + SpringMVC +Mybatis做动态数据源,实现读写分离Spring AOP + SpringMVC +Mybatis做动态数据源,实现读写分离Spring AOP + SpringMVC +Mybatis做动态数据源,实现读写分离

    SpringBoot中的AOP+自定义注解(源代码)

    SpringBoot 中的 Aop + 自定义注解 1. @AspectJ 1.1 `@AspectJ` 切面类 1.2 `@Pointcut` 创建切入点 1.3 通知 1.4 Spring AOP 和 AspectJ AOP 有什么区别? 2. 在 SpringBoot 中使用 Aop 功能 2.0 创建一个...

    c# aop+mvc+facAop

    6. **配置文件**:项目可能包含Web.config或其他配置文件,用于设置AOP框架的选项,如启用或禁用某些特性,或配置日志输出。 为了深入了解这个项目,你需要打开并分析Dzend.MvcTest的源代码,查看类定义、控制器、...

Global site tag (gtag.js) - Google Analytics