log4j 的配置
将log4j 日志文件的具体配置单独介绍, 是因为它的配置方式将直接决定日志的产生方式,存放位置,输出格式等。
在/ src 下建立log4j.properties。内容如下:
# 这里定义日志配置根logger,其中后面的INFO,console,file 表示日志记录的优先级,依次为提示,警告,文件
log4j.rootLogger=INFO,console,file
# 这里定义的是日志输出的地方, 例如有控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、
以流的形式发送到其它地方,这里采用的是输出到控制台的形式,也即是web 服务器
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 这里定义当文件大小到达指定尺寸(10M)的时候产生一个新的文件,存放在D 盘下,名称为wgems.txt
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=d:\\wgems.txt
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=7
# 下面定义控制台日志输出的格式,log4j 提供了4 种输出格式,如根据HTML 样式、自由指定样式、包含日志级别与信息
的样式和包含日志时间、线程、类别等信息的样式等等。本文采用的是自由指定样式。
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 这里需要说明的就是日志信息格式中几个符号所代表的含义:
-X 号:X 信息输出时左对齐
%m 输出代码中指定的消息
% p 输出优先级, 即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log 信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows 平台为“rn”,Unix 平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,
SSS},输出类似:2002 年10 月18 日22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
log4j.appender.console.layout.ConversionPattern=%-4r[%t]%-5p %c %l %x-%m%n
# 下面定义了当达到指定大小时,硬盘上的日志文件的输出格式
log4j.appender.file.layout=org.apache.log4j.PatternLayout
1 Struts 的整合配置
Struts 要与Spring 结合使用, 主要的方法就是让Struts 知道Spring 的存在,以让Spring 管理相关的组件,避免在程序中
直接编写组件的依赖关系建立。
首先要在/ webRoot / web -inf /目录下新建一个名叫applicationContext.xml 的配置文件, 并在/ webRoot / lib/ 目录下
添加Spring 的核心包以及log4j 日志包, 名称分别为:commons-logging.jar,spring.jar。
然后在/webRoot/web-inf / web.xml 文件里的最后添加一段:
这个类是Struts 的Action 抽象类的实现, 可以使用它来取得ApplicationContext 的实例,然后进一步取得Spring 容器
2 Spring 的整合配置
在Spring 配置applicationContext.xml 文件配置Spring 要管理的bean,并配置日志拦截器。
本文以该管理系统中的材料管理模块来示例:
首先定义被代理的bean 文件(该bean 文件主要封装了材料管理的业务逻辑处理)
<bean id="clxxbjBean" class="cl.model.clxxbjBean" />
其次定义日志拦截器,如下所示:
<! --配置日志拦截器(Advice)-->
<bean name="logger" class="aop.LoggingInterceptor" />
<! --切面配置器(Aspect)-->
<bean id="advisor_log"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<! -这里表示对日子记录操作的具体实现由名叫logger 的类来完成
<property name="advice"ref="logger"></property>
<! -这里表示只要方法名为del(删除),add(添加),update(结尾)的方法在执行期间都要被织入advices 也即本文中的日志记录操作
<property name="patterns">
<list>
<value>.*del</value>
<value>.*add</value>
<value>.*update</value>
</list>
</property>
</bean>
<! --配置拦截器代理-->
<bean name="loggingAutoProxy"class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<! 这里定义被代理的类,也就是前面定义的clxxbjBean
<property name="beanNames">
<list>
<value>clxxbjBean</value>
</list>
</property>
<! -这里定义了前述的所有被代理的类的共同拦截对象advisor_log,这个Aspect 已经在前面定义
<property name="interceptorNames">
<list>
<value>advisor_log</value>
</list>
</property>
通过将日志管理模块与正常业务逻辑模块的分开,我们将单独采用一个类来实现日志管理这个工作,并采取在指定方法
执行后再织入日志记录操作,具体代码如下所示:
将log4j 日志文件的具体配置单独介绍, 是因为它的配置方式将直接决定日志的产生方式,存放位置,输出格式等。
在/ src 下建立log4j.properties。内容如下:
# 这里定义日志配置根logger,其中后面的INFO,console,file 表示日志记录的优先级,依次为提示,警告,文件
log4j.rootLogger=INFO,console,file
# 这里定义的是日志输出的地方, 例如有控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、
以流的形式发送到其它地方,这里采用的是输出到控制台的形式,也即是web 服务器
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 这里定义当文件大小到达指定尺寸(10M)的时候产生一个新的文件,存放在D 盘下,名称为wgems.txt
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=d:\\wgems.txt
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=7
# 下面定义控制台日志输出的格式,log4j 提供了4 种输出格式,如根据HTML 样式、自由指定样式、包含日志级别与信息
的样式和包含日志时间、线程、类别等信息的样式等等。本文采用的是自由指定样式。
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 这里需要说明的就是日志信息格式中几个符号所代表的含义:
-X 号:X 信息输出时左对齐
%m 输出代码中指定的消息
% p 输出优先级, 即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log 信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows 平台为“rn”,Unix 平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,
SSS},输出类似:2002 年10 月18 日22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
log4j.appender.console.layout.ConversionPattern=%-4r[%t]%-5p %c %l %x-%m%n
# 下面定义了当达到指定大小时,硬盘上的日志文件的输出格式
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%p-%m%l%n
1 Struts 的整合配置
Struts 要与Spring 结合使用, 主要的方法就是让Struts 知道Spring 的存在,以让Spring 管理相关的组件,避免在程序中
直接编写组件的依赖关系建立。
首先要在/ webRoot / web -inf /目录下新建一个名叫applicationContext.xml 的配置文件, 并在/ webRoot / lib/ 目录下
添加Spring 的核心包以及log4j 日志包, 名称分别为:commons-logging.jar,spring.jar。
然后在/webRoot/web-inf / web.xml 文件里的最后添加一段:
<!-- spring配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring.xml</param-value>
</context-param>
最后是让struts 的action 改继承org.springframework.web.struts.ActionSupport,导入包spring-struts-3.2.0.jar
这个类是Struts 的Action 抽象类的实现, 可以使用它来取得ApplicationContext 的实例,然后进一步取得Spring 容器
所管理的Bean 实例。
具体代码实现如下所示:import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.struts.DispatchActionSupport;
public class ClxxbjAction extends DispatchActionSupport{
public ActionForward execute(){
WebApplicationContext context =getWebApplicationContext();
//以后在每次使用到ClxxbjBean 被指定的方法时都会织入日志记录操作
ClxxbjBean clxxbjbean =(ClxxbjBean)context.getBean("clxxbjBean");
}
}
2 Spring 的整合配置
在Spring 配置applicationContext.xml 文件配置Spring 要管理的bean,并配置日志拦截器。
本文以该管理系统中的材料管理模块来示例:
首先定义被代理的bean 文件(该bean 文件主要封装了材料管理的业务逻辑处理)
<bean id="clxxbjBean" class="cl.model.clxxbjBean" />
其次定义日志拦截器,如下所示:
<! --配置日志拦截器(Advice)-->
<bean name="logger" class="aop.LoggingInterceptor" />
<! --切面配置器(Aspect)-->
<bean id="advisor_log"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<! -这里表示对日子记录操作的具体实现由名叫logger 的类来完成
<property name="advice"ref="logger"></property>
<! -这里表示只要方法名为del(删除),add(添加),update(结尾)的方法在执行期间都要被织入advices 也即本文中的日志记录操作
<property name="patterns">
<list>
<value>.*del</value>
<value>.*add</value>
<value>.*update</value>
</list>
</property>
</bean>
<! --配置拦截器代理-->
<bean name="loggingAutoProxy"class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<! 这里定义被代理的类,也就是前面定义的clxxbjBean
<property name="beanNames">
<list>
<value>clxxbjBean</value>
</list>
</property>
<! -这里定义了前述的所有被代理的类的共同拦截对象advisor_log,这个Aspect 已经在前面定义
<property name="interceptorNames">
<list>
<value>advisor_log</value>
</list>
</property>
</bean>
通过将日志管理模块与正常业务逻辑模块的分开,我们将单独采用一个类来实现日志管理这个工作,并采取在指定方法
执行后再织入日志记录操作,具体代码如下所示:
…//代码省略
public class LoggingInterceptor implements AfterReturningAdvice{
//这里定义了一个数据库连接对象
ControlDbBean controldb=new ControlDbBean();
String text=""; //将写入日志的日志信息字符串
//获取日志的名字
Log log=LogFactory.getLog("wgems");
//这里方法的4 个参数表示目标方法的回传值、方法实
例、参数对象数组和目标对象
public void afterReturning(Object returnValue,Method method,Object []args,Object target)throws Throwable
try{
System.out.println("进入AOP 日志管理");
OracleCachedRowSet ocrs=null;
//获得数据库系统当前时间
ocrs=controldb.querySqlToRowset ("select to_char (sysdate,‘yyyy-mm-dd hh24:mi:ss')dd from dual");
ocrs.next();
String db_date=ocrs.getObject("dd").toString();
ocrs.close();
//如果方法实例名称中包含add 字符串,也就是执行添加操作
if(method.getName().indexOf("add")! =-1){
//调用log 类,并以信息提示的级别记录下所添加的具体数据以及具体时间
log.info(db_date+"添加了一行新材料数据"+"\n");
log.info("添加的数据为:");
for(int i=0;i<args.length;i++){
text+=args[i].toString()+"\t";
}
log.info(text+"\n");
text=""; //日志信息字符串重新归位
}
//如果方法实例名称中包含update 字符串,也就是执行更新操作
…//代码省略
//如果方法实例名称中包含del 字符串,也就是执行删除操作
…//代码省略
}catch(Exception e){
System.out.println("日志写入错误! "+e.getMessage());
}
}