软件如何记录api

时间:2025-03-27 12:12:43 技术杂谈

记录API的方法多种多样,可根据项目需求选择合适的技术栈和策略。以下是常见的实现方式及最佳实践:

一、使用中间件(如ASP.NET Core中间件)

通过自定义中间件,可在请求处理前后捕获请求/响应数据及执行时间。

示例(ASP.NET Core)

```csharp

public class LogAttribute : ActionFilterAttribute

{

private readonly ILogger _logger;

private readonly Stopwatch _stopwatch;

public LogAttribute(ILogger logger)

{

_logger = logger;

_stopwatch = new Stopwatch();

}

public override void OnActionExecuting(ActionExecutingContext context)

{

_stopwatch.Start();

context.Result = new OkObjectResult(context.RouteValues);

}

public override void OnActionExecuted(ActionExecutedContext context)

{

var duration = _stopwatch.Elapsed.TotalMilliseconds;

_logger.LogInformation($"[{context.RouteValues["controller"]}] {context.RouteValues["action"]} - 耗时:{duration}ms");

context.Result = context.Result as OkObjectResult;

context.Result.Body = new StringContent($"执行耗时:{duration}ms");

}

}

```

优点:轻量级,可灵活扩展日志内容。

二、使用AOP(面向切面编程)

通过AOP框架(如Spring AOP)在方法调用前后插入日志逻辑,减少代码重复。

示例(Spring Boot)

```java

@Aspect

@Component

public class LoggingAspect {

private final Logger logger;

@Autowired

public LoggingAspect(Logger logger) {

this.logger = logger;

}

@Around("execution(* com.example.controller..*Controller.*(..))")

public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {

long start = System.currentTimeMillis();

Object result = joinPoint.proceed();

long executionTime = System.currentTimeMillis() - start;

logger.info("{} executed in {} ms", joinPoint.getSignature(), executionTime);

return result;

}

}

```

优点:代码解耦,可统一管理日志逻辑。

三、使用框架内置功能

YII框架:通过`beforeAction`和`afterAction`钩子记录请求耗时。

Spring Boot:使用`@Timed`注解或`ApplicationListener`实现。

四、日志内容建议

记录以下关键信息:

基础信息:

请求URL、HTTP方法、请求头、用户信息等;

性能指标:

响应时间、吞吐量等;

业务数据:

请求参数、响应体(敏感信息需脱敏);

错误信息:

异常堆栈、状态码等。

五、注意事项

性能影响:

避免在高频接口中过度记录,建议使用异步日志或采样机制;

安全性:

敏感数据需加密存储,避免日志泄露;

日志级别:

生产环境建议使用`INFO`或`WARN`,开发环境可开放`DEBUG`。

通过以上方法,可有效监控API性能,排查问题,并为后续优化提供数据支持。