记录API的方法多种多样,可根据项目需求选择合适的技术栈和策略。以下是常见的实现方式及最佳实践:
一、使用中间件(如ASP.NET Core中间件)
通过自定义中间件,可在请求处理前后捕获请求/响应数据及执行时间。
示例(ASP.NET Core):
```csharp
public class LogAttribute : ActionFilterAttribute
{
private readonly ILogger private readonly Stopwatch _stopwatch; public LogAttribute(ILogger { _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性能,排查问题,并为后续优化提供数据支持。基础信息:
性能指标:
业务数据:
错误信息:
性能影响:
安全性:
日志级别: