已自己项目为例:
定义切面:
package com.lezhi.treadstone.ifc.common;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.LinkedBlockingDeque;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.collections.map.LinkedMap;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import ch.qos.logback.core.rolling.RollingFileAppender;
import com.fasterxml.jackson.databind.ObjectMapper;
@Component
@Aspect
public class LogAspect {
@Autowired
private HttpServletRequest request;
@Autowired
private ObjectMapper jsonMapper;
@SuppressWarnings("unchecked")
@Around("within(com.lezhi.treadstone.ifc.*.*Action)")
public Object doExecute(ProceedingJoinPoint joinPoint) throws Throwable {
ResultModel rm = null;
Object[] args = joinPoint.getArgs();
for(int i = 0;i<args.length;i++){
if(args[i].getClass().equals(ResultModel.class)){
rm = (ResultModel)args[i];
break;
}
}
if(rm==null){
rm = new ResultModel();
request.setAttribute("resultModel", rm);
}
rm.setStartTime(new Date());
String queryString = jsonMapper.writeValueAsString(request.getParameterMap());
rm.setRequestUrl(request.getRequestURL().toString()+(StringUtils.isNotBlank(queryString) ? "|" + request.getMethod() + "|" + queryString : ""));
Object retval = null;
try{
retval = joinPoint.proceed();
}catch(Exception e){
exceptioncl(rm,e,joinPoint);
return rm;
}
rm.setEndTime(new Date());
String returnObjectType = retval.getClass().getName();
String realType = returnObjectType.substring(returnObjectType.lastIndexOf(".")+1, returnObjectType.length());
if(realType.equalsIgnoreCase("HashMap") || realType.equalsIgnoreCase("LinkedMap")){//方法中 获取返回信息
String methodReturnMsg = "",methodReturnResult = "";
Map<String,Object> map = (Map<String,Object>)retval;
methodReturnMsg = ObjectUtils.toString(map.get("msg"));
methodReturnResult = ObjectUtils.toString(map.get("result"));
rm.setMsg(methodReturnMsg);
rm.setResult(methodReturnResult);
}
if(realType.equalsIgnoreCase("ResultModel")){//方法后
rm = (ResultModel)retval;
if(rm.getCode() == -1000){//异常信息
return rm;
}else{//正常信息
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
Log.Info(method.getDeclaringClass(),method.getDeclaringClass().getSimpleName()+"\\"+method.getName(), rm.toString());
}
}
return rm;
}
private void exceptioncl(ResultModel rm,Exception e ,JoinPoint joinPoint){
rm.setCode(-1000);
rm.setMsg("系统错误");
rm.setEndTime(new Date());
StringBuilder sb = new StringBuilder();
sb.append(e.getMessage()+"\r\n");
for(StackTraceElement ste : e.getStackTrace()){
sb.append(ste+"\r\n");
}
rm.setExceptionDesc(sb.toString());
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
Log.Info(method.getDeclaringClass(),method.getDeclaringClass().getSimpleName()+"\\"+method.getName(), rm.toString());
}
}
2、重构log
package com.lezhi.treadstone.ifc.common;
import java.net.URL;
import java.util.Map;
import java.util.logging.LogManager;
import javax.servlet.ServletRequest;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.lang.StringUtils;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
public class Log {
public final static Object lock = new Object();
private static Logger getLogger(Class clazz,String fun){
Logger logger = null;
synchronized (lock) {
logger = (Logger) LoggerFactory.getLogger(clazz.getSimpleName());
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
//Remove all previously added appenders from this logger instance.
logger.detachAndStopAllAppenders();
//define appender
RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<ILoggingEvent>();
//policy
TimeBasedRollingPolicy<ILoggingEvent> policy = new TimeBasedRollingPolicy<ILoggingEvent>();
policy.setContext(loggerContext);
policy.setMaxHistory(5);
policy.setFileNamePattern("d:\\userLog\\"+fun+"\\%d{yyyy-MM-dd}.log");
policy.setParent(appender);
policy.start();
//encoder
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(loggerContext);
encoder.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n");
encoder.start();
//start appender
appender.setRollingPolicy(policy);
appender.setContext(loggerContext);
appender.setEncoder(encoder);
appender.setPrudent(true); //support that multiple JVMs can safely write to the same file.
appender.start();
logger.addAppender(appender);
//setup level
logger.setLevel(Level.INFO);
//remove the appenders that inherited 'ROOT'.
logger.setAdditive(false);
}
return logger;
}
public static void Info(Class clazz,String fun,String str){
Logger logger = getLogger(clazz,fun);
logger.info(str);
}
public static void Debug(Class clazz,String fun,String str){
Logger logger = getLogger(clazz,fun);
logger.info(str);
}
public static void Error(Class clazz,String fun,String str){
Logger logger = getLogger(clazz,fun);
logger.info(str);
}
}