目录
Spring集成日志及应用
集成log4g2
详看工具包中的日志
应用一:
1、创建日志实体
import com.xxx.util.JsonUtil;
import lombok.Getter;
import java.time.LocalDateTime;
@Getter
public class LogBean {
//log4j2往文件中写数据时需要调用到每个属性的setter方法
private Integer id;
/**
* 操作人id
*/
private Integer userId;
/**
* 用户操作
*/
private String operation;
/**
* 所调用的方法
*/
private String method;
/**
* 调用方法的参数
*/
private String params;
/**
* 方法返回值
*/
private String result
/**
* 用户的ip地址
*/
private String ip;
/**
* 操作的时间
*/
private LocalDateTime createTime;
private LogBean() {
}
public LogBean(Integer userId, String operation, String method, String result, String params, String ip, LocalDateTime createTime) {
this.userId = userId;
this.operation = operation;
this.method = method;
this.result = result;
this.params = params;
this.ip = ip;
this.createTime = createTime;
}
@Override
public String toString() {
return JsonUtil.obj2String(this);
}
}
2、创建工具类
工具类接口
public interface LogUtil {
void info(LogBean logBean);
void warn(LogBean logBean);
void error(LogBean logBean);
void debug(LogBean logBean);
void trace(LogBean logBean);
}
工具类实现类
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component("LogUtil")
@Slf4j
public class LogUtilImpl implements LogUtil {
@Override
public void info(LogBean logBean) {
log.info(logBean.toString());
}
@Override
public void warn(LogBean logBean) {
log.warn(logBean.toString());
}
@Override
public void error(LogBean logBean) {
log.error(logBean.toString());
}
@Override
public void debug(LogBean logBean) {
log.debug(logBean.toString());
}
@Override
public void trace(LogBean logBean) {
log.trace(logBean.toString());
}
}
3、测试
import org.junit.jupiter.api.Test;
import java.time.LocalDateTime;
class LogUtilImplTest {
LogUtil logUtil = new LogUtilImpl();
@Test
void info() {
logUtil.info(new LogBean(123, "123", "123", "123", "123", LocalDateTime.now()));
}
}


应用二:通过AOP为指定方法添加日志支持
import com.xxx.constant.WegoConst;
import com.xxx.domain.User;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Arrays;
@Slf4j
@Component
@Aspect
public class LogAdvance {
//切入点
@Pointcut("execution(* com.xxx.controller..*.*(..))")
public void logPointcut() {
}
/**
* 后置增强
*
* @param joinPoint 可以通过joinPoint获取所执行的方法以及该方法传入的参数
*/
@After("logPointcut()")
public void afterMethod(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
Object[] params = joinPoint.getArgs();
System.out.print(methodName + " " + Arrays.toString(params));
//记录日志
log(methodName, params, "");
}
private void log(String methodName, Object[] params, String result) {
//获取传递的参数值
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
User user = (User) request.getSession().getAttribute(WegoConst.SESSION_USER);
Long userId = null;
if (user != null) {
userId = user.getId();
}
//TODO: 获取用户的真实IP
String ip = "";
log.info(new LogBean(userId, "", methodName, Arrays.toString(params), ip, LocalDateTime.now(), result).toString());
}
/**
* 返回增强
*
* @param joinPoint 可以通过joinPoint获取所执行的方法以及该方法传入的参数
* @param result 获取该方法的返回值
*/
@AfterReturning(pointcut = "logPointcut()", returning = "result")
public void afterReturningMethod(JoinPoint joinPoint, int result) {
String methodName = joinPoint.getSignature().getName(); //获取方法名
Object[] params = joinPoint.getArgs(); //获取参数列表
System.out.print(methodName + " " + Arrays.toString(params) + " " + result);
//记录日志
log(methodName, params, result + "");
}
/**
* 异常增强
*
* @param joinPoint 可以通过joinPoint获取所执行的方法以及该方法传入的参数
* @param ex 该方法所产生的异常
*/
@AfterThrowing(pointcut = "logPointcut()", throwing = "ex")
public void afterThrowingMethod(JoinPoint joinPoint, ArithmeticException ex) {
String methodName = joinPoint.getSignature().getName();
Object[] params = joinPoint.getArgs();
System.out.print(methodName + " " + Arrays.toString(params) + " " + ex);
//记录日志
log(methodName, params, ex.getMessage());
}
}

3770

被折叠的 条评论
为什么被折叠?



