您的位置:首页 > 编程语言 > ASP

使用AspectJ为Java程序添加日志管理

2012-03-23 13:27 295 查看
最近接手了一个项目完全没有日志记录,出了问题定位起来很麻烦,于是提出要补加日志,但直接在程序中补加Log工作量实在有点大,想到了Spring AOP的日志管理实际上是整合了AspectJ,那么直接使用AspectJ进行日志管理岂不是省了很多麻烦~~

于是上网查找资料,按照网上的一些实例进行AspectJ日志管理的开发,大概的步骤如下:

1、在{project}/src目录下添加log4j.properties文件,文件内容如下:

### set log levels ###
log4j.rootLogger = DEBUG ,  stdout ,  D

### 输出到控制台 ###
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.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/springLog.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n


2、在web.xml中整合Log4j的配置;

<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INFclasseslog4j.properties</param-value>
</context-param>


3、下载ajdt1.6,并在Myeclipse中安装ajdt插件,myeclipse的插件安装方法这里就不赘述了,Google搜一下就解决了;

4、将aspectjrt.jar放到WEB-INF/lib目录下;

5、插件安装完成后,右键工程——>AspectJ Tools——>Convert to AspectJ Project将工程转换为AspectJ Project;

6、一切准备就绪,就可以写Aspect程序了,File——>New——>Aspect,编写Aspect代码。

package aspectj.log;
import org.apache.log4j.Logger;

/**
* Aspectj自动记录日志类
* author:qjx
* Create Date:2012-3-23
*/
public aspect AutoTrace
{
private static final Logger logger = Logger.getLogger(AutoTrace.class);

/*
* 声明切入点,所有public方法
*/
pointcut callPointCut() :
execution(public * *.*(..));

/*
* 进入方法前记录日志
*/
before() : callPointCut()
{
logger.debug("Entering.." + thisJoinPoint.getSignature().getDeclaringTypeName()+ "." + thisJoinPoint.getSignature().getName());
}

/*
* 方法执行后记录日志
*/
after() : callPointCut()
{
logger.debug("Exiting.." + thisJoinPoint.getSignature().getDeclaringTypeName()+ "." + thisJoinPoint.getSignature().getName());
}
}


注:按照网上提供的实例,大多数切入点的声明为pointcut callPointCut() :
call(public * *.*(..));低版本的AspectJ可能使用call定义切入点表达式,但由于我使用的AspectJ1.6,用call定义表达式时程序启动会报错,使用execution关键字可以解决这个问题,是否是版本问题我也只是猜测,并不确定,如是因为其它原因导致的还请留言告知,多谢~~,错误信息如下:


严重: Exception sending context initialized event to listener instance of class listener.InitAppParam
org.aspectj.lang.NoAspectBoundException: Exception while initializing aspectj_log_AutoTrace: org.aspectj.lang.NoAspectBoundException: aspectj_log_AutoTrace
at aspectj.log.AutoTrace.aspectOf(AutoTrace.aj:1)
at listener.InitAppParam.contextInitialized(InitAppParam.java:17)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4205)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4704)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:675)
at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:601)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1315)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1061)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
at org.apache.catalina.core.StandardService.start(StandardService.java:525)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: org.aspectj.lang.NoAspectBoundException: aspectj_log_AutoTrace
at aspectj.log.AutoTrace.aspectOf(AutoTrace.aj:1)
at aspectj.log.AutoTrace.<clinit>(AutoTrace.aj:11)
... 25 more
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: