思路
- 基于springAOP拦截controller层
- 另起一条线程,加锁,分开controller和mapper日志文件避免日志穿插错乱
- 同时打印“threadName”,方便关联查找mybatis输出的数据库操作日志
package com.aaa.bbb.aspect;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import javax.servlet.http.HttpServletRequest;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
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 com.alibaba.fastjson.JSON;
import com.aaa.bbb.util.CommonUtil;
import cn.hutool.cache.impl.TimedCache;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
@Aspect
@Component
public class WebLogAspect {
private static final Logger logger = LogManager.getLogger();
private Lock lock = new ReentrantLock();
/** 以 controller 包下定义的所有请求为切入点 */
@Pointcut("execution(public * com.aaa.bbb.controller..*.*(..))")
public void webLog() {
}
/**
* 打印接口请求日志
*
* @param joinPoint
* @return
* @throws Throwable
*/
@Around("webLog()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Object result = joinPoint.proceed();
stopWatch.stop();
if (!logger.isInfoEnabled()) {
return result;
}
try {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String url = request.getRequestURL().toString();
String method = request.getMethod();
String remoteAddr = request.getRemoteAddr();
String threadName = Thread.currentThread().getName();
Object[] args = joinPoint.getArgs();
Map<String, String[]> parameterMap = request.getParameterMap();
long timeConsuming = stopWatch.getTotalTimeMillis();
StringBuffer sb = new StringBuffer();
sb.append("\n");
sb.append("======================================== Start ========================================");
// 开始打印请求日志
// 打印请求相关参数
// 打印处理请求的线程名称,方便和SQL关联查询
sb.append("\n");
sb.append(StrUtil.format("ThreadName : {}", threadName));
// 打印请求 url
sb.append("\n");
sb.append(StrUtil.format("URL : {}", url));
// 打印 Http method
sb.append("\n");
sb.append(StrUtil.format("HTTP Method : {}", method));
// 打印调用 controller 的全路径以及执行方法
sb.append("\n");
sb.append(StrUtil.format("Class Method : {}.{}", joinPoint.getSignature().getDeclaringTypeName(),
joinPoint.getSignature().getName()));
// 打印请求的 IP
sb.append("\n");
sb.append(StrUtil.format("IP : {}", remoteAddr));
// 打印请求入参
sb.append("\n");
sb.append(StrUtil.format("Request Args : {}", ArrayUtil.toString(args)));
sb.append("\n");
sb.append(StrUtil.format("Request Params : {}", JSON.toJSONString(parameterMap)));
// 打印出参
sb.append("\n");
sb.append(StrUtil.format("Response Args : {}", StrUtil.toString(result)));
// 执行耗时
sb.append("\n");
sb.append(StrUtil.format("Time-Consuming : {} ms", timeConsuming));
sb.append("\n");
sb.append(StrUtil
.format("========================================= End ========================================="));
logger.info(sb.toString());
} catch (Exception e) {
logger.error("打印请求日志发送异常");
}
return result;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout
pattern="[%d{yyyy-MM-dd HH:mm:ss,SSS}] (%t) %p %c:%L - %m%n"
charset="UTF-8" />
</Console>
<RollingFile name="aaa"
fileName="${sys:catalina.home}/logs/aaa/bbb.log"
filePattern="logs/aaa-%d{yyyy-MM-dd}-%i.log"
ignoreExceptions="false">
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %C:%L : %msg%n" />
<SizeBasedTriggeringPolicy size="10MB" />
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20" />
</RollingFile>
<RollingFile name="aaa-controller"
fileName="${sys:catalina.home}/logs/aaa/bbb-controller.log"
filePattern="logs/aaa-controller-%d{yyyy-MM-dd}-%i.log"
ignoreExceptions="false">
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %C:%L : %msg%n" />
<SizeBasedTriggeringPolicy size="10MB" />
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20" />
</RollingFile>
<RollingFile name="aaa-dao"
fileName="${sys:catalina.home}/logs/aaa/bbb-dao.log"
filePattern="logs/aaa-dao-%d{yyyy-MM-dd}-%i.log"
ignoreExceptions="false">
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %C:%L : %msg%n" />
<SizeBasedTriggeringPolicy size="10MB" />
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console" />
<AppenderRef ref="aaa" />
</Root>
<Logger name="org.springframework" level="info" />
<Logger name="com.aaa.bbb.aspect.WebLogAspect"
level="info">
<AppenderRef ref="aaa-controller" />
</Logger>
<Logger name="com.aaa.bbb.mapper" level="debug">
<AppenderRef ref="aaa-dao" />
</Logger>
</Loggers>
</Configuration>
<?xml version="1.0" encoding="UTF-8"?>
<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:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
xmlns:tx="http://www.springframework.org/schema/tx">
<aop:aspectj-autoproxy expose-proxy="true"></aop:aspectj-autoproxy>
<context:component-scan base-package="com.aaa.bbb" />
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.aaa.bbb" />
</bean>
</beans>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73841.html