• Spring Boot日志处理


    2.4 日志处理

    2.4.1 记录日志内容

    • 请求url
    • 访问者ip
    • 调用方法classMethod
    • 参数args
    • 返回内容

    2.4.2 新建包aspect,新建日志切面处理类

    package com.fei.aspect;
    
    import java.util.Arrays;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.Signature;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    /**
     * Created by zxf on 2019年9月28日
     */
    @Aspect // 进行切面操作
    @Component // 组件扫描
    public class LogAspect {
    
    	private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
    	// 切面
    	@Pointcut("execution(* com.fei.controller.*.*(..))")
    	public void log() {
    	}
    
    	// 切面前操作
    	@Before("log()") // 传递切面方法
    	public void doBefore(JoinPoint joinPoint) {
    		logger.info("---------doBefore------");
    
    		ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    		HttpServletRequest request = attributes.getRequest();
    
    		String url = request.getRequestURL().toString();
    		String ip = request.getRemoteAddr();
    
    		Signature signature = joinPoint.getSignature();
    		String classMethod = signature.getDeclaringTypeName() + "." + signature.getName();
    		Object[] args = joinPoint.getArgs();
    
    		RequestLog requestLog = new RequestLog(url, ip, classMethod, args);
    
    		logger.info("Reqeust : {}", requestLog);
    	}
    
    	// 切面后操作
    	@After("log()") // 传递切面方法
    	public void doAfter() {
    		logger.info("---------doAfter------");
    	}
    
    	// 切面返回后操作
    	@AfterReturning(returning = "result", pointcut = "log()") // 传递切面方法
    	public void doAfterReturn(Object result) {
    		logger.info("Result : {}", result);
    	}
    
    	/**
    	 * 封装日志记录需要的内容
    	 * 
    	 * @author fei
    	 *
    	 */
    	private class RequestLog {
    		private String url;// 请求url
    		private String ip;// 访问者ip
    
    		private String classMethod;// 调用方法
    		private Object[] args;// 参数
    
    		public RequestLog(String url, String ip, String classMethod, Object[] args) {
    			super();
    			this.url = url;
    			this.ip = ip;
    			this.classMethod = classMethod;
    			this.args = args;
    		}
    
    		@Override
    		public String toString() {
    			return "[url=" + url + ", ip=" + ip + ", classMethod=" + classMethod + ", args=" + Arrays.toString(args)
    					+ "]";
    		}
    
    	}// RequestLog
    }// LogAspect
    

    测试日志切面处理Controller

    @Controller
    public class IndexController {
    
    	@GetMapping("/{id}/{name}")
    	public String toIndex(@PathVariable("id") Integer id, @PathVariable("name") String name) {
    		System.out.println("====index()方法执行====");
    
    		return "index";
    	}
    }
    
  • 相关阅读:
    Linux Apache Mysql PHP楷模设置配备摆设1
    谋划phpMyAdmin2.6以上版本数据乱码题目
    MYSQL到ORACLE法式迁徙的注意变乱
    关于MySQL中的mysqldump饬令的应用
    MySQL 5.0新特性教程 存储进程:第一讲
    Mysql 数据库的导入与导出
    Linux Apache Mysql PHP典范设置装备安排2
    MYSQL数据库初学者运用指南2
    图解MySQL数据库的铺排和操作3
    MySQL完成表中掏出随机数据
  • 原文地址:https://www.cnblogs.com/zxfei/p/11605418.html
Copyright © 2020-2023  润新知