查看原文
其他

今日代码大赏 | 接口日志输出

松柏 程序员鱼皮 2024-03-18

程序员在开发项目时,需要编写大量的日志,因为日志不仅可以监控系统运行状态,还能帮助我们进行故障排查和调试。

一个典型的日志应用场景是:监控所有接口的执行情况。

怎么实现这个需求呢?难道要一个一个写 log.info 吗?

其实如果是在 Spring 项目中,我们可以通过 AOP 机制来实现这个需求。

示例代码如下:

/**
 * 请求日志 AOP
 *
 **/

@Aspect
@Component
@Slf4j
public class LogInterceptor {

    /**
     * 执行拦截
     */

    @Around("execution(* com.yupi.springbootinit.controller.*.*(..))")
    public Object doInterceptor(ProceedingJoinPoint point) throws Throwable {
        // 计时
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        // 获取请求路径
        RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
        HttpServletRequest httpServletRequest = ((ServletRequestAttributes) requestAttributes).getRequest();
        // 生成请求唯一 id
        String requestId = UUID.randomUUID().toString();
        String url = httpServletRequest.getRequestURI();
        // 获取请求参数
        Object[] args = point.getArgs();
        String reqParam = "[" + StringUtils.join(args, ", ") + "]";
        // 输出请求日志
        log.info("request start,id: {}, path: {}, ip: {}, params: {}", requestId, url,
                httpServletRequest.getRemoteHost(), reqParam);
        // 执行原方法
        Object result = point.proceed();
        // 输出响应日志
        stopWatch.stop();
        long totalTimeMillis = stopWatch.getTotalTimeMillis();
        log.info("request end, id: {}, cost: {}ms", requestId, totalTimeMillis);
        return result;
    }
}

完整代码片段来源于代码小抄,欢迎点击进入小程序阅读!

在线访问:https://www.codecopy.cn/post/4855ct

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存