Aop实现记录请求日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Aop实现记录请求日志
/**
 * @ClassName: LogAspect
 * @Description: 日志记录AOP实现
 */
@Component
@Aspect
public class LogAspect {
  private final static Logger logger = LoggerFactory.getLogger(LogAspect.class);
  @Pointcut("execution(* com.**.**.**.controller.*.*(..))")
  public void pointcut() {
  }
  /**
   * 记录程序运行时候抛出的异常信息
   */
  @AfterThrowing(pointcut = "pointcut()", throwing = "ex")
  public void doThrowing(JoinPoint joinPoint, Exception ex) {
    HttpServletRequest request;
    try {
      request = getHttpServletRequest();
    } catch (Exception e) {
      return;
    }
    // 获取输入参数
    String queryString = request.getQueryString();
    String method = request.getMethod();
    String params = "";
    if ("get".equalsIgnoreCase(method)) {
      params = queryString;
    } else if ("post".equalsIgnoreCase(method)) {
      params = JsonUtils.getJSONString(request.getParameterMap());
    }
    String methodName = joinPoint.getSignature().getName();
    logger.error("[请求:[{}];参数:[{}];方法:[{}]发生异常,原因: ]",
        request.getRequestURI(), params, methodName, ex);
  }
  private HttpServletRequest getHttpServletRequest() {
    RequestAttributes ra = RequestContextHolder.getRequestAttributes();
    ServletRequestAttributes sra = (ServletRequestAttributes) ra;
    return sra.getRequest();
  }
  /**
   * @Title:doAround
   * @Description: 环绕触发
   */
  @Around(value = "pointcut()")
  public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
    long startTime = System.currentTimeMillis();
    HttpServletRequest request;
    HttpSession session;
    try {
      request = getHttpServletRequest();
      session = request.getSession();
    } catch (Exception e) {
      return pjp.proceed();
    }
    // 获取输入参数
    String queryString = request.getQueryString();
    String method = request.getMethod();
    String requestURI = request.getRequestURI();
    String params = "";
    if ("get".equalsIgnoreCase(method)) {
      params = queryString;
    } else if ("post".equalsIgnoreCase(method)) {
      params = JsonUtils.getJSONString(request.getParameterMap());
    }
    // 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行
    Object result = pjp.proceed();// result的值就是被拦截方法的返回值
    logger.info("[用户[{}];请求:[{}];请求方式:[{}];参数:[{}];结果:[{}]; 耗时:[{}]ms]",
        session.getAttribute(USER), requestURI, method, params,
        result, System.currentTimeMillis() - startTime);
    return result;
  }
}


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
5月前
|
SQL 监控 Java
在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
这篇文章介绍了如何在IDEA和Spring Boot中使用AOP技术实现日志信息的记录到数据库的详细步骤和代码示例。
在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
|
2月前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
56 1
|
5月前
|
Go 开发者
【应用服务 App Service】App Service发生错误请求时,如何查看IIS Freb日志,从中得知错误所发生的模块,请求中所携带的Header信息
【应用服务 App Service】App Service发生错误请求时,如何查看IIS Freb日志,从中得知错误所发生的模块,请求中所携带的Header信息
|
5月前
|
JavaScript Serverless Linux
函数计算产品使用问题之遇到Node.js环境下的请求日志没有正常输出时,该如何排查
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
5月前
|
存储 Kubernetes API
【APIM】Azure API Management Self-Host Gateway是否可以把请求的日志发送到Application Insights呢?让它和使用Azure上托管的 Gateway一样呢?
【APIM】Azure API Management Self-Host Gateway是否可以把请求的日志发送到Application Insights呢?让它和使用Azure上托管的 Gateway一样呢?
|
5月前
|
数据采集 存储 监控
Haskell爬虫中日志记录:监控HTTP请求与响应
Haskell爬虫中日志记录:监控HTTP请求与响应
|
2月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
440 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
24天前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
|
3月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
360 3
|
2天前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
MySQL事务日志-Undo Log工作原理分析