国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

面向切面記錄log4j日志

2019-11-14 15:05:27
字體:
來源:轉載
供稿:網友

首先,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.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%nlog4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=d:/test_log.loglog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%nlog4j.rootLogger=warn, stdout,filelog4j.logger.org.hibernate.type=infolog4j.logger.org.hibernate.tool.hbm2ddl=debugcom.lzq.spring.service = debug

 

7、顯示結果:

Console窗口

文件位置: 

日志文件內容:

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海阳市| 翁源县| 都安| 闻喜县| 岑巩县| 宁夏| 惠州市| 永顺县| 虹口区| 博乐市| 敦煌市| 神木县| 海原县| 柳江县| 保德县| 昌吉市| 韶关市| 当雄县| 长泰县| 桂林市| 开江县| 澳门| 菏泽市| 广河县| 周宁县| 临颍县| 长沙市| 蕲春县| 大悟县| 双城市| 库尔勒市| 阿巴嘎旗| 广平县| 连平县| 凤翔县| 灌南县| 永春县| 康定县| 湖口县| 民县| 庆元县|