配置文件源码:
<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