Springboot使用AOP實現統一處理Web請求日志


1.要使我們自定義的記錄日志能夠打印出來,我們需要先排除springboot默認的記錄日志,添加如下的設置

2.新建 resources/log4j.properties 

我的設置為:

# LOG4J\u914D\u7F6E
log4j.rootCategory=INFO, stdout, file, errorfile
log4j.category.com.wutongshu=DEBUG, bootfile
log4j.logger.error=errorfile

# \u63A7\u5236\u53F0\u8F93\u51FA
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

# root\u65E5\u5FD7\u8F93\u51FA
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.file=logs/all.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

# error\u65E5\u5FD7\u8F93\u51FA
log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorfile.file=logs/error.log
log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd
log4j.appender.errorfile.Threshold = ERROR
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

# com.springboot\u4E0B\u7684\u65E5\u5FD7\u8F93\u51FA
log4j.appender.bootfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.bootfile.file=logs/my.log
log4j.appender.bootfile.DatePattern='.'yyyy-MM-dd
log4j.appender.bootfile.layout=org.apache.log4j.PatternLayout
log4j.appender.bootfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n

3.然后創建Web層日志切面類,這里我設置的是controller層的所有請求都會打印日志信息

其中@Order(i)表示AOP切面的優先級

在切入點前的操作,按order的值由小到大執行
在切入點后的操作,按order的值由大到小執行

/**
 * 日志切面類
 */
@Aspect
@Component
@Order(5)
public class WebLogAspect {
    private Logger logger=Logger.getLogger(getClass());

    private ThreadLocal<Long> startTime=new ThreadLocal<>();


    @Pointcut("execution(public * com.*.*.web.*.*(..))")
    public void webLog(){

    }

    @Before(value = "webLog()")
    public void doBefore(JoinPoint point){
        startTime.set(System.currentTimeMillis());

        logger.info("WebLogAspect.doBefore............");
        ServletRequestAttributes attributes=
                (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request=attributes.getRequest();
        logger.info("IP : "+request.getRemoteAddr());
        logger.info("URL:" + request.getRequestURL().toString());
        logger.info("HTTP_METHOD:" +request.getMethod());
        logger.info("CLASS_NAME : " + point.getSignature().getDeclaringTypeName()+"."+point.getSignature().getName());
        logger.info("ARGS : " + Arrays.toString(point.getArgs()));
    }


    @AfterReturning(value = "webLog()",returning = "ret")
    public void doAferReturning(Object ret){
        logger.info("WebLogAspect.doAfterReturning.............");
        logger.info("Resp: " + ret);
        logger.info("Spend Time : " + (System.currentTimeMillis()-startTime.get()));
    }
}

4.輸入http://localhost:8087/test/hello進行測試

可看到控制台輸出依次打印出IP,URL,請求方法,請求路徑,方法入參以及花費的時間

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM