springboot使用aop处理日志

1、新建切面类
package com.bxbank.ares.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
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;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Arrays;

/**

  • @program: ares
  • @description: 切面类
  • @author: zhaowencheng
  • @create: 2019-09-16 21:04
    **/

@Aspect
@Component
public class LogAspect {

private static final Logger LOGGER = LoggerFactory.getLogger(LogAspect.class);

/**
 * 进入方法时间戳
 */
private Long startTime;
/**
 * 方法结束时间戳(计时)
 */
private Long endTime;

//定义请求日志切点,指定路径
@Pointcut("execution(* com.bxbank.ares.controller.*Controller.*(..))")
public void logPointcut() {
}

/**
 * 设置请求日志信息
 *
 * @param joinPoint
 */
@Before("logPointcut()")
public void doBefore(JoinPoint joinPoint) {
    // 接收到请求,记录请求内容
    ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = servletRequestAttributes.getRequest();
    //打印请求的内容
    startTime = System.currentTimeMillis();
    LOGGER.info("请求开始时间:{}" + LocalDateTime.now());
    LOGGER.info("请求Url : {}" + request.getRequestURL().toString());
    LOGGER.info("请求方式 : {}" + request.getMethod());
    LOGGER.info("请求ip : {}" + request.getRemoteAddr());
    LOGGER.info("请求方法 : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
    LOGGER.info("请求参数 : {}" + Arrays.toString(joinPoint.getArgs()));
}

/**
 * 请求返回
 *
 * @param result
 * @throws Throwable
 */
@AfterReturning(returning = "result", pointcut = "logPointcut()")
public void doAfterReturning(Object result) {
    endTime = System.currentTimeMillis();
    LOGGER.info("请求结束时间:{}" + LocalDateTime.now());
    LOGGER.info("请求耗时:{}" + (endTime - startTime));
    // 处理完请求,返回内容
    LOGGER.info("请求返回 : {}" + result);
}

/**
 * 异常
 *
 * @param throwable
 */
@AfterThrowing(value = "logPointcut()", throwing = "throwable")
public void doAfterThrowing(Throwable throwable) {
    // 保存异常日志记录
    LOGGER.error("发生异常时间:{}" + LocalDateTime.now());
    LOGGER.error("抛出异常:{}" + throwable.getMessage());
}

}

2、在pom.xml文件中引入相关jar包

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
    </dependency>

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
    <!-- 去掉spring-boot的默认log配置 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- 引入log4j2依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
        <version>2.0.0.RELEASE</version>
    </dependency>
    <!-- 加上这个才能辨认到log4j2.yml文件 -->
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-yaml</artifactId>
    </dependency>

3、在log4j2.yml文件中配置日志输出格式
Configuration:
status: warn
monitorInterval: 30

Properties: # 定义全局变量
Property: # 缺省配置(用于开发环境)。其他环境需要在VM参数中指定,如下:
#测试:-Dlog.level.console=warn -Dlog.level.xjj=trace
#生产:-Dlog.level.console=warn -Dlog.level.xjj=info
- name: log.level.console
value: debug
- name: log.sql.level
value: trace
#输出文件的路径
- name: LOG_HOME
value: /logs
Appenders:
Console: #输出到控制台
name: CONSOLE
target: SYSTEM_OUT
ThresholdFilter:
level: ${sys:log.level.console} # “sys:”表示:如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值
onMatch: ACCEPT
onMismatch: DENY
PatternLayout: #输出日志的格式
pattern: “%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n”
RollingFile: # 输出到文件,超过128MB归档
- name: info
ignoreExceptions: false
fileName: L O G H O M E / {LOG_HOME}/ LOGHOME/{date:yyyy-MM}/ d a t e : y y y y − M M − d d / i n f o . l o g f i l e P a t t e r n : " {date:yyyy-MM-dd}/info.log filePattern: " date:yyyyMMdd/info.logfilePattern:"{LOG_HOME}/${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz"
ThresholdFilter:
level: info
onMatch: ACCEPT
onMismatch: DENY
PatternLayout:
pattern: “%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n”
Policies:
SizeBasedTriggeringPolicy:
size: “128 MB”
DefaultRolloverStrategy:
max: 1000

- name: debug
  ignoreExceptions: false
  fileName: ${LOG_HOME}/${date:yyyy-MM}/${date:yyyy-MM-dd}/debug.log
  filePattern: "${LOG_HOME}/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log.gz"
  ThresholdFilter:
    level: debug
    onMatch: ACCEPT
    onMismatch: DENY
  PatternLayout:
    pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n"
  Policies:
    SizeBasedTriggeringPolicy:
      size: "128 MB"
  DefaultRolloverStrategy:
    max: 1000

- name: error
  ignoreExceptions: false
  fileName: ${LOG_HOME}/${date:yyyy-MM}/${date:yyyy-MM-dd}/error.log
  filePattern: "${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz"
  ThresholdFilter:
    level: error
    onMatch: ACCEPT
    onMismatch: DENY
  PatternLayout:
    pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n"
  Policies:
    SizeBasedTriggeringPolicy:
      size: "128 MB"
  DefaultRolloverStrategy:
    max: 1000

Loggers:
Root:
level: info
AppenderRef:
- ref: CONSOLE
- ref: info
- ref: debug
- ref: error
Logger: # 为com.xjj包配置特殊的Log级别,方便调试
- name: com.bxbank.ares.dao
additivity: false
level: ${sys:log.sql.level}
AppenderRef:
- ref: info
- ref: debug
- ref: error
- ref: CONSOLE
5、在application中读取log4j.yml文件
logging:
config: classpath:log4j2.yml
#启用切面
aop:
proxy-target-class: true
auto: true

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值