springmvc加入日志管理和事务管理

配置文件源码:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
           http://www.springframework.org/schema/context   
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
    <!-- 自动扫描controller bean,把作了注解的类转换为bean -->
    <context:component-scan base-package="cn.com" />

    <bean
        class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
    <!-- 定义个缺省的控制适配器 -->
    <!-- 获取配置文件 -->
    <!-- 数据源 -->
    <bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations" value="classpath:db_mysql.properties" />
    </bean>

    <bean id="mydataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClass}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>
<bean id="transactionManager"  
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
    <property name="dataSource" ref="mydataSource" />
</bean>
    <!--  aop日志配置-->
    <aop:aspectj-autoproxy />
    <aop:config>
        <aop:pointcut id="logPointCut" expression="execution(* cn.com.zkyt.controller.*.*(..))" />
        <aop:pointcut id="logPointCut1" expression="execution(* cn.com.zkyt.service.*.*(..))" />
        <aop:advisor advice-ref="transactionAdvice" pointcut-ref="logPointCut1" />
        <aop:aspect ref="logAspect">
            <aop:around pointcut-ref="logPointCut" method="doSystemLog" />
        </aop:aspect>
        
    </aop:config>

<!-- 事物处理 -->
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception,RuntimeException,SQLException"/>
            <tx:method name="*" propagation="SUPPORTS" read-only="true" />
        </tx:attributes>
    </tx:advice>
    <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
    <!-- 对模型视图名称的解析,在请求时模型视图名称添加前后缀 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:prefix="" p:suffix=".jsp">
        <property name="order" value="0" />
    </bean>

    <!-- 创建SqlSessionFactory,同时指定数据源 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="mydataSource" />
        <property name="mapperLocations" value="classpath*:cn/com/zkyt/config/*.xml" />
    </bean>

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="cn.com.zkyt.dao" />
    </bean>
    <!-- 统一异常捕获页面 -->
    <!--<bean id="exceptionHandler" class="cn.com.zkyt.exception.MyExceptionHandler" />

    --><bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设置上传文件的最大尺寸为1MB -->
        <property name="maxUploadSize">
            <value>104857600</value>
        </property>
        <property name="maxInMemorySize">
            <value>4096</value>
        </property>
    </bean>
</beans>  


LogAspect界面代码:

package cn.com.zkyt.aop;

import java.lang.reflect.Method;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.log4j.MDC;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Controller;

import cn.com.zkyt.util.MethodsUtil;

@Controller
public class LogAspect {

    public Object doSystemLog(ProceedingJoinPoint point) throws Throwable {

        long time1 = System.currentTimeMillis();

        String methodName = point.getSignature().getName();
        Class targetClass = point.getTarget().getClass();
        MDC.put("method", "");
        MDC.put("class", "");
        MDC.put("username", "");
        MDC.put("userid",0 );
        Logger log = Logger.getLogger(LogAspect.class.getName());
        
        Object s=log.getClass();
        
        log.debug(methodName + "方法执行 starting");
        Object[] arguments = point.getArgs();
        //
        MDC.put("class", targetClass);
        Object object = null;
        try {
            if (StringUtils.isNotEmpty(methodName)) {

                //

                if (!(methodName.startsWith("set") || methodName
                        .startsWith("get"))) {

                    // Class targetClass = point.getTarget().getClass();
                    Signature signature = point.getSignature();
                    MethodSignature methodSignature = (MethodSignature) signature;
                    Method method = methodSignature.getMethod();
                    // Method result = (Method) method.invoke(methodName,
                    // arguments);
                    // s_logger.debug("Mocking " + formatCall(point));

                    if (method != null) {

                        boolean hasAnnotation = method.isAnnotationPresent(MethodLog.class);
                        MDC.put("method", method.getName());
                        object = point.proceed();
                        if (hasAnnotation) {
                            MethodLog annotation = method.getAnnotation(MethodLog.class);

                            String methodDescp = annotation.desc();
                            /*
                             * if (logger.isDebugEnabled()) {
                             * logger.debug("Action method:" + method.getName()
                             * + " Description:" + methodDescp); }
                             */

                            log.debug("方法名:" + method.getName() + " 方法描述:"+ methodDescp);
                            
                            HttpServletRequest request = (HttpServletRequest) arguments[1];
                            Object dd = request.getSession().getAttribute("username");
                            Object id = request.getSession().getAttribute("userid");
                            
                            if (dd!=null&&!dd.equals("")) {
                                String username=dd.toString();
                                MDC.put("username", username);
                                MDC.put("userid",Integer.parseInt(id.toString()) );
                                log.info(methodDescp+"("+method.getName()+")");
                                
                            } else {
                                
                                MDC.put("username", "游客");
                                MDC.put("userid", 0);
                                log.info(methodDescp+"("+method.getName()+")");
                                
                            }
                            //log.info("操作动作:"+methodDescp+",方法为:"+method.getName());
                            // log.info("the argument is : " + o);
                            // }
                        }

                    }
                }
            }
            // point.proceed();
            //
        } catch (Exception e) {
            log.error("抛出异常exception:"+MethodsUtil.getStackDetail(e.getStackTrace()));
            log.info("事物回滚");
        }
        log.debug(methodName + "方法ending");
        long time2 = System.currentTimeMillis();
        log.debug(methodName + "方法执行时间:" + (time2 - time1));
        return object;
    }

}

所有方法均通过这个方法,进行日志处理

log4j代码:

log4j.rootLogger=DEBUG,stdout,debug,info,error
# stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} [%p]%t-%c-%m%n
#debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.File=${catalina.home}/logs/weibaoshop
#log4j.appender.R.BufferedIO=true
#log4j.appender.R.BufferSize=8192
#log4j.appender.R.MaxFileSize=10MB
#log4j.appender.R.MaxBackupIndex=10
log4j.appender.debug.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} [%p]%t-%c-%m%n
log4j.appender.debug.encoding=UTF-8
#info
 log4j.logger.org.springframework=OFF
 log4j.appender.info = org.apache.log4j.jdbc.JDBCAppender
 log4j.appender.info.layout=org.apache.log4j.PatternLayout
 log4j.appender.info.BufferSize=1
 log4j.appender.info.Threshold =INFO
 log4j.appender.info.driver=com.mysql.jdbc.Driver
 log4j.appender.info.URL=jdbc:mysql://115.28.64.72:3306/weibaoshop?useOldAliasMetadataBehavior=true
 log4j.appender.info.user=epimap
 log4j.appender.info.password=epimap.123456
 log4j.appender.info.sql=insert into wbs_log_info(Class,Method,username,userid,date,LogLevel,message) values ('%X{class}','%X{method}','%X{username}','%X{userid}','%d{yyyy/MM/dd HH:mm:ss}','%p','%m')
 #error
 log4j.appender.error = org.apache.log4j.jdbc.JDBCAppender
 log4j.appender.error.layout=org.apache.log4j.PatternLayout
 log4j.appender.error.BufferSize=1
 log4j.appender.error.driver=com.mysql.jdbc.Driver
 log4j.appender.error.URL=jdbc:mysql://115.28.64.72:3306/weibaoshop?useOldAliasMetadataBehavior=true
 log4j.appender.error.Threshold =ERROR
 log4j.appender.error.user=epimap
 log4j.appender.error.password=epimap.123456
 log4j.appender.error.sql=insert into wbs_logerror_info(Class,Method,username,userid,date,exceptionMsg) values ('%X{class}','%X{method}','%X{username}','%X{userid}','%d{yyyy/MM/dd HH:mm:ss}','%m')
#mybatis
log4j.logger.org.mybatis.example.BlogMapper=DEBUG
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
#log4j.logger.java.sql.Connection=DEBUG
#log4j.logger.java.sql.Statement=DEBUG
#log4j.logger.java.sql.PreparedStatement=DEBUG

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值