接口日志统一打印

思路

  • 基于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>

猜你喜欢

转载自blog.csdn.net/qq_28807077/article/details/109783440