项目中需要将service中的类方法的调用过程,使用log4j日志记录。
service中的类和方法都很多,不可能在每个类中单独添加log4j日志记录的功
能,因此我们在这里使用AOP的思想进行横向切面。
以service类中的方法为切入点,通过AOP在方法调用前后使用log4j输出日志,内容包括正在调用的类和方法名。
在配置过程中,笔者碰到了一些或大或小的细节上的问题,在此作为记录。
首先是AOP的配置上,我们有两种选择,一是通过XML配置,二是通过注解。
XML配置可以通过以下示例:
则对应的Aspect方法可以不用使用@Aspect、@Before和@After注解。
如果使用注解方式,则在XML配置文件中,只需要一行配置,开启自动代理功能即可:
此时,对应的Aspect方法可以如下示例:
其次,是Spring配置文件所属域上的坑,在这里配置的AOP的XML文件,如果需要成功执行,需要在
web.xml文件中,将此XML配置文件加入到Servlet-Context中,而不是Spring-Context中,示例如下:
上图是配置全局的spring上下文,但是aop配置文件在这里不能成功。
我们需要把aop的配置加载,放在servlet的初始化上下文中。
上述工作对于AOP的配置大致完成了,我们接下来需要配置log4j。在工程中,如果没有log4j的配
置,我们可以直接在src目录下创建一个log4j.properties文件;如果需要自定义此文件,可以在
web.xml中配置log4j,如:
log4j.properties文件中可以参考下列配置,前者是详细的注解和参考,后者是笔者需要区分日志
等级输出,以及需要同时输出到控制台和文件的配置:
### set log levels ###
log4j.rootLogger = INFO, console, I, W, E
### 输出信息到控制台 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} class:%c method:%l%n%m%n
### 输出INFO 级别以上的日志 ###
log4j.appender.I = org.apache.log4j.RollingFileAppender
#log4j.appender.W.File =${scheduleProject}WEB-INF/logs/schedule.log
###输出到指定文件###
log4j.appender.I.File = e://logs/lof4j_info.log
log4j.appender.I.Append = true
log4j.appender.I.Threshold = INFO
log4j.appender.I.MaxFileSize = 50000KB
log4j.appender.I.layout = org.apache.log4j.PatternLayout
log4j.appender.I.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出WARN 级别以上的日志 ###
log4j.appender.W = org.apache.log4j.RollingFileAppender
#log4j.appender.W.File =${scheduleProject}WEB-INF/logs/schedule.log
###输出到指定文件###
log4j.appender.W.File = e://logs/lof4j_warn.log
log4j.appender.W.Append = true
log4j.appender.W.Threshold = WARN
log4j.appender.W.MaxFileSize = 50000KB
log4j.appender.W.layout = org.apache.log4j.PatternLayout
log4j.appender.W.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
#### 输出DEBUG 级别以上的日志 ###
#log4j.appender.D = org.apache.log4j.RollingFileAppender
##log4j.appender.D.File =${scheduleProject}WEB-INF/logs/schedule.log
####输出到指定文件###
#log4j.appender.D.File = e://logs/lof4j_error.log
#log4j.appender.D.Append = true
#log4j.appender.D.Threshold = DEBUG
#log4j.appender.D.MaxFileSize = 50000KB
#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
### 输出ERROR 级别以上的日志 ###
log4j.appender.E = org.apache.log4j.RollingFileAppender
#log4j.appender.E.File = ${scheduleProject}WEB-INF/logs/schedule.log
log4j.appender.E.File = e://logs/lof4j_error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.MaxFileSize = 50000KB
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss} [ %l\:%c\:%t\:%r ] - [ %p ] %m%n
最后,我们运行工程,使用该方法,查看AOP结果: