面向切面记录log4j日志

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

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

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

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

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

1、引入jar包:

2、切面Aspect代码:

package com.lzq.spring.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import com.lzq.spring.test.AOPTest;
/**
 * 切面
 * @author lzq
 *
 */
public class Aspect {

  Logger logger = Logger.getLogger(AOPTest.class);
  String strLog = null ;

  /**
   * 前置通知:在某连接点之前执行的通知,但这个通知不能阻止连接点前的执行
   * @param jp 连接点:程序执行过程中的某一行为,例如,AServiceImpl.barA()的调用或者抛出的异常行为
   */
  public void doBefore(JoinPoint jp) {
    strLog = "log Begining method: "
        + jp.getTarget().getClass().getName() + "."
        + jp.getSignature().getName();
    logger.warn(strLog);
  }
    /**
     * 环绕通知:包围一个连接点的通知,可以在方法的调用前后完成自定义的行为,也可以选择不执行
     * 类似Web中Servlet规范中的Filter的doFilter方法。
     * @param pjp 当前进程中的连接点
     * @return
     * @throws Throwable
     */
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        long time = System.currentTimeMillis();
        Object retVal = pjp.proceed();
        time = System.currentTimeMillis() - time;
        System.out.println("process time: " + time + " ms");
        return retVal;
    }
    /**
     * 抛出异常后通知 : 在方法抛出异常退出时执行的通知。
     * @param jp 连接点:程序执行过程中的某一行为,例如,AServiceImpl.barA()的调用或者抛出的异常行为
     */
    public void doAfter(JoinPoint jp) {
    	strLog ="doAfter:log Ending method: "
    			+ jp.getTarget().getClass().getName() + "."
    			+ jp.getSignature().getName();
    	logger.warn(strLog);
    }
}

3、业务代码:

业务逻辑接口:

package com.lzq.spring.service;

/**
 * 接口 AService
 */
public interface AService {
    public void cool(String _msg);
    public void cool();
}

业务接口的实现:

package com.lzq.spring.service;

/**
 * 接口的实现
 * @author lzq
 *
 */
public class AServiceImpl implements AService {
  @Override
  public void cool() {
    System.out.println("哇,楼主好帅!");
  }
  @Override
  public void cool(String name) {
    System.out.println("哇,楼主"+name+",你好帅啊!");
  }
}

4、测试AOPTest:

package com.lzq.spring.test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.lzq.spring.service.AService;

public class AOPTest{
  public static void main(String[] args){
    BeanFactory factory = new ClassPathXmlApplicationContext("ApplicationContext.xml");
    AService aService = (AService)factory.getBean("aService");
    aService.cool();
    aService.cool("泉浴五江");
  }
}

5、Spring配置文件ApplicationContext.xml:

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

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

### direct log messages to stdout ###
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{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=d:/test_log.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=warn, stdout,file
log4j.logger.org.hibernate.type=info
log4j.logger.org.hibernate.tool.hbm2ddl=debug
com.lzq.spring.service = debug

7、显示结果:

Console窗口

文件位置:

日志文件内容:

时间: 2024-08-03 10:36:51

面向切面记录log4j日志的相关文章

C# 面向切面编程--监控日志记录方案

背景:现在公司整体在做监控平台,要求把各个部分的细节都记录下来,在前台页面上有所显示,所以现在需要做的就是一个监控日志的记录工作,今天讲的就是渲染监控日志的例子. 现状:当前的渲染程序没有为监控日志记录预留代码接入口,因此要新增加监控日志势必要增加新的代码.但是如果只是单单在已有逻辑中新增日志记录的代码似乎不太合理:因为记录日志的代码很多都是一样的,直接插入代码有很多重复代码:原有代码已经上线并且运行良好,新增代码会破坏原有封装,甚至增加出错的可能:再者从设计的角度来说,记录日志不属于任何一个功

Spring基础、IOC(控制反转)、AOP(面向切面编程)、Log4j、注解配置

学习示例代码,包含本篇介绍的Spring常用操作示例和所有所需jar文件下载地址:http://download.csdn.net/detail/daijin888888/9556697 1.什么是Spring,有什么作用 --Spring框架属于一个解决方案框架,可以对其他技术和框架进行整合应用. --*好处是:将程序中的各个组件和框架技术进行解耦,便于日后系统维护,升级和扩展操作. --在SSH中,会将Action,DAO组件都交给Spring框架管理,由Spring框架创建这些对象,建立这

在android中配置 slf4j + log4j 日志记录框架

需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j 框架来实现.slf4j 是日志记录的一个facade,支持多种日志框架.log4j是个很优秀的日志记录框架. 实现: 下载类库: 先到各主站点下载类库 slf4j 网址 :http://www.slf4j.org/download.html log4j网址: http://logging.apach

ELK菜鸟手记 (一) 环境配置+log4j日志记录

1. 背景介绍 在大数据时代,日志记录和管理变得尤为重要. 以往的文件记录日志的形式,既查询起来又不方便,又造成日志在服务器上分散存储,管理起来相当麻烦, 想根据一个关键字查询日志中某个关键信息相当困难. 这个时候,ELK诞生了. 什么是ELK? 简单来说:它是一套完整的日志记录和分析的解决方案平台. 2. 技术栈介绍 ELK = Elasticsearch + Logstash + Kibana 2-1) Elasticsearch: ( Elasticsearch is a distribu

log4j日志记录简析

log4j的日志系统包含两个主要概念:Logger与Appender,前者负责触发日志记录动作,后者决定日志输出至何处. 各个Logger实例之间可能存在父子关系,所有实例都有一个共同的root Logger实例,如下文的第一行的rootCategory就是root Logger实例. log4j示例文件如下: log4j.rootCategory=info,stdout # CONSOLE appender not used by default log4j.appender.stdout=o

springboot-aop面向切面编程

需求: 项目中需要记录用户操作信息,例如用户登陆系统后做了那些操作,需要有具体的日志记录. 解决办法: 1.编写操作记录日志业务类,在使用的方法中调用(一般记录方式). 2.使用面向切面方式记录日志,例如针对某些业务处理方法进行日志记录. 3.通过注解方式,在调用的业务方法上增加日志类注解. 推荐使用第二.第三中方式,使用灵活,如果不需要日志记录,将切面取消即可,第一种不够灵活.一些介绍使用注解方式编写日志记录. 项目结构如下: 在pom.xml导入依赖包 <?xml version="1

Spring AOP(面向切面示例)

什么是AOP?基本概念切面(aspect):横切关注点被模块化的特殊对象.通知(advice):切面必须要完成的工作.切面中的每个方向称之为通知.通知是在切面对象中的.目标(target):被通知的对象.代理(proxy):向目标对象应用通知后创建的对象. 连接点(joinpoint):目标对象的程序执行的某个特定位置.如某个方法调用前,调用后的位置.包括两个信息:1.目标程序的哪个方法?2.方法执行 前还是执行后?切点(pointcut):每个类会有多个连接点,AOP通过切点定位到特定的边接点

Spring AOP 面向切面编程

AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 在Spring中提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例

[Spring实战系列](16)面向切面编程(AOP)概述

1. 简介 在软件中,有些行为对于大多数应用都是通用的.日志,安全和事务管理的确很重要,但他们是都是应用对象主动参与的行为呢?如果让应用对象只关注自己所针对的业务领域问题,而其他方面的问题由其他应用对象来处理,这样会不会更好? 在软件开发中,分布于应用中多处的功能被称为横切关注点.通常,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑中).将这些横切关注点与业务逻辑相分离是面向切面编程索要解决的. 上图展示了一个被划分为模块的典型应用.每个模块的核心功能都是为特