26,Spring Boot中使用AOP統(tǒng)一處理Web請(qǐng)求日志
1,引入jar
<!-- springboot-aop 技術(shù),統(tǒng)一處理日志記錄--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
2,寫(xiě)web日志類(lèi)
packagecom.nvli.chapter10;importorg.aspectj.lang.JoinPoint;importorg.aspectj.lang.annotation.AfterReturning;importorg.aspectj.lang.annotation.Aspect;importorg.aspectj.lang.annotation.Before;importorg.aspectj.lang.annotation.Pointcut;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.stereotype.Component;importorg.springframework.web.context.request.RequestContextHolder;importorg.springframework.web.context.request.ServletRequestAttributes;importjavax.servlet.http.HttpServletRequest;importjava.util.Enumeration;@Aspect//將一個(gè)java類(lèi)定義為切面類(lèi)@ComponentpublicclassWebLogAspect{publicstaticfinalLoggerlogger=LoggerFactory.getLogger(WebLogAspect.class);/**
? ? * @Pointcut? 定義一個(gè)切入點(diǎn),可以是一個(gè)規(guī)則表達(dá)式,比如下面的某個(gè)package下的所有函數(shù),也可以是一個(gè)注解等
? ? */@Pointcut("execution(public * com.nvli.chapter10.controller.*.*(..))")publicvoidwebLog(){}/**根據(jù)需要在切入點(diǎn)開(kāi)始處切入內(nèi)容
? ? * 使用@Before 在切入點(diǎn)開(kāi)開(kāi)始切入內(nèi)容
? ? * 使用Aop前置配置通知攔截請(qǐng)求信息
? ? * @param joinPoint
? ? * @throws Throwable
? ? */@Before("webLog()")publicvoiddoBefore(JoinPointjoinPoint)throwsThrowable{//接到請(qǐng)求,記錄請(qǐng)求內(nèi)容ServletRequestAttributesattributes=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();HttpServletRequestrequest=attributes.getRequest();//記錄下日志請(qǐng)求內(nèi)容logger.info("URL : "+request.getRequestURL());logger.info("Http_METHOO : "+request.getMethod());logger.info("IP : "+request.getRemoteAddr());logger.info("CLASS_METHOD : "+joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());logger.info("ASK_TIME : "+System.currentTimeMillis());Enumeration<String>enu=request.getParameterNames();while(enu.hasMoreElements()){Stringname=enu.nextElement();logger.info("name : {},value : {} ",name,request.getParameter(name));}}/**
? ? * 根據(jù)需要在不同位置的切入內(nèi)容
? ? * @AfterReturning 在切入點(diǎn)return內(nèi)容后切入內(nèi)容(可以用來(lái)對(duì)處理返回值做一些加工處理)
? ? * @param ret
? ? * @throws Throwable
? ? */@AfterReturning(returning="ret",pointcut="webLog()")publicvoiddoAfterReturning(Objectret)throwsThrowable{//處理完成,返回內(nèi)容logger.info("RESPONSE : "+ret);}}
3,添加日志
只是需要在resource目錄下添加 logback.xml就可以
<?xml version="1.0" encoding="UTF-8"?><configurationdebug="false"><!--定義日志文件的存儲(chǔ)地址 勿在 LogBack 的配置中使用相對(duì)路徑--><propertyname="LOG_HOME"value="./logs"/><!-- 控制臺(tái)輸出 --><appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender"><encoderclass="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化輸出:%d表示日期,%thread表示線(xiàn)程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度%msg:日志消息,%n是換行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg? %n</pattern></encoder></appender><!-- 按照每天生成日志文件 --><appendername="FILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--日志文件輸出的文件名--><FileNamePattern>${LOG_HOME}/runtime.log.%d{yyyy-MM-dd}.log</FileNamePattern><!--志文件保留天數(shù)--><MaxHistory>30</MaxHistory></rollingPolicy><encoderclass="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化輸出:%d表示日期,%thread表示線(xiàn)程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度%msg:日志消息,%n是換行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder><!--日志文件最大的大小--><triggeringPolicyclass="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>10MB</MaxFileSize></triggeringPolicy></appender><!-- 日志輸出級(jí)別 --><rootlevel="INFO"><appender-refref="STDOUT"/><appender-refref="FILE"/></root></configuration>