使用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
- 使用AspectJ为Java程序添加日志管理
- Spring AOP使用@AspectJ实现日志管理
- java程序日志管理
- 为java程序添加字库
- SLF4J库管理java程序日志输出
- 使用Spring AOP 的@AspectJ记录日志
- 使用mciSendString为程序添加音乐
- 将java 程序添加为系统服务
- 为java程序添加远程jmi监控
- java project 转换为 aspectj project
- 使用Kieker(AspectJ)监控控制台程序
- 使用Java为图片添加水印
- web 工程添加日志管理
- java注解结合aspectj AOP进行日志打印
- 为opentack 日志添加行号
- 为程序添加DMP
- 为android添加程序。
- AspectJ aop记录日志
- 三种方法从字符串中剔除某类字符
- 条款03:use const whenever possible
- 使用 vmware-vdiskmanager增加虚拟机中的磁盘空间
- Latex论文排版技巧再总结
- 问题汇总!!!
- 使用AspectJ为Java程序添加日志管理
- 条款02:尽可能使用const, enum, inline替代define
- 移动技术开发之谜
- 教你如何迅速秒杀99%的海量数据处理面试题
- Google Maps in QlikView
- 自动sga内存管理
- RSS源推荐大全(it版)
- MYSQL数据库备份命令
- Eclipse反编译工具Jad及插件JadClipse配置