在 Java 里,“API 接口怎么打日志”通常有几层做法,从最基础到生产级方案都给你讲清楚。
❌ 不推荐
System.out.println("请求来了");
✅ 推荐(SLF4J + Logback / Log4j2)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
@RestController
@Slf4j
public class UserController {
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
log.info("查询用户,id={}", id);
return userService.getById(id);
}
}
@Component
public class LogInterceptor implements HandlerInterceptor {
private static final Logger log =
LoggerFactory.getLogger(LogInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
log.info("API请求: {} {}",
request.getMethod(),
request.getRequestURI());
return true;
}
}
注册拦截器:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LogInterceptor logInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(logInterceptor)
.addPathPatterns("/**");
}
}
@Aspect
@Component
@Slf4j
public class ApiLogAspect {
@Around("execution(* com.xxx.controller..*(..))")
public Object logApi(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
String method = pjp.getSignature().getName();
log.info("接口开始: {}", method);
Object result = pjp.proceed();
log.info("接口结束: {}, 耗时={}ms",
method, System.currentTimeMillis() - start);
return result;
}
}
logging:
level:
org.springframework.web: DEBUG
或更细:
logging:
level:
org.springframework.web.servlet: DEBUG
✅ 日志内容建议包含:
✅ 不要打印:
✅ 使用:
log.info("userId={}, api={}", userId, api);
而不是字符串拼接
| 场景 | 方案 |
|---|---|
| 学习 / 小项目 | @Slf4j |
| 统一接口日志 | 拦截器 |
| 精细控制 | AOP |
| 全链路追踪 | SkyWalking / Sleuth |
如果你用的是 Spring Boot / Spring Cloud / 纯 Servlet / 特定框架,可以告诉我,我可以给你更贴合的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。