Struts+Spring+log4j框架下的日志管理的实现

 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

log4j.appender.file.layout.ConversionPattern=%p-%m%l%n


 Struts 与Spring 框架整合
 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());
     }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值