使用AspectJ为Java程序添加日志管理
2012-03-23 13:27
295 查看
最近接手了一个项目完全没有日志记录,出了问题定位起来很麻烦,于是提出要补加日志,但直接在程序中补加Log工作量实在有点大,想到了Spring AOP的日志管理实际上是整合了AspectJ,那么直接使用AspectJ进行日志管理岂不是省了很多麻烦~~
于是上网查找资料,按照网上的一些实例进行AspectJ日志管理的开发,大概的步骤如下:
1、在{project}/src目录下添加log4j.properties文件,文件内容如下:
2、在web.xml中整合Log4j的配置;
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代码。
注:按照网上提供的实例,大多数切入点的声明为pointcut callPointCut() :
call(public * *.*(..));低版本的AspectJ可能使用call定义切入点表达式,但由于我使用的AspectJ1.6,用call定义表达式时程序启动会报错,使用execution关键字可以解决这个问题,是否是版本问题我也只是猜测,并不确定,如是因为其它原因导致的还请留言告知,多谢~~,错误信息如下:
于是上网查找资料,按照网上的一些实例进行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
相关文章推荐
- 完成一个学生管理程序,使用学号作为键添加5个学生对象,并可以将全部信息保存在文件中,可以实现对学生信息的学号查找,输出全部学生信息的功能。
- 使用 Lotus Notes 和 Eclipse 管理和运行 Java 程序
- 使用.bat文件运行Java程序的一个示例
- JAVA连接MYSQL,使用PreparedStatement 写查询,修改,添加,删除,语句
- 在Android中使用native程序(非Java)来广播intent
- eclipse 中添加自定义 classpath 的方法,以及 javac 和 java 的一些使用细节
- Java编程使用Runtime和Process类运行外部程序的方法
- 使用exe4j将java程序打包成exe可执行文件
- linux Enterprise5 添加删除程序无法正常使用 解决
- 使用Daemon将java程序运行为后台service
- Unity-Android通信:AndroidJava 使用Unity c#编写Android程序调用任何方法
- 使用IntelliJ IDEA11创建Java程序
- 关于java程序实现自动选人系统 使用I/O流完成
- Java程序内存分析:使用mat工具分析内存占用
- 使用JAVA写的一个简易通讯程序(一)
- 通过命令行指定 Java 程序运行时使用的字符集
- 使用DOS编译运行多个java程序
- Java使用Debug进行程序调试
- java原生数据队列的简单使用,可变数据集合,遍历过程中动态添加数据并能在后续遍历过程中获取
- java轮子-使用springboot做一个带界面的web程序