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

来源:互联网 发布:小照域名授权源码2.9 编辑:程序博客网 时间:2024/06/05 07:05

        最近接手了一个项目完全没有日志记录,出了问题定位起来很麻烦,于是提出要补加日志,但直接在程序中补加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.ConsoleAppenderlog4j.appender.stdout.Target = System.outlog4j.appender.stdout.layout = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{1}:%L - %m%n### 输出到日志文件 ###log4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = logs/springLog.loglog4j.appender.D.Append = truelog4j.appender.D.Threshold = DEBUGlog4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.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.InitAppParamorg.aspectj.lang.NoAspectBoundException: Exception while initializing aspectj_log_AutoTrace: org.aspectj.lang.NoAspectBoundException: aspectj_log_AutoTraceat 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_AutoTraceat aspectj.log.AutoTrace.aspectOf(AutoTrace.aj:1)at aspectj.log.AutoTrace.<clinit>(AutoTrace.aj:11)... 25 more


 

原创粉丝点击