java web中filter记录http请求日志的核心是:在dofilter中用contentcachingrequestwrapper/responsewrapper读取请求响应内容,记录url、ip、方法、耗时、状态码等,并脱敏敏感参数,通过@component或filterregistrationbean注册,避免阻塞与日志爆炸。

在 Java Web 应用中,使用 Filter 记录 HTTP 请求日志是一种轻量、通用且不侵入业务代码的方式。核心思路是:在请求进入 Servlet 之前记录请求信息(如 URL、方法、参数、IP),在响应返回之后记录响应状态和耗时。
1. 编写一个基础的请求日志 Filter
实现 javax.servlet.Filter 接口,重写 doFilter 方法。注意需包装 HttpServletRequest 和 HttpServletResponse,以便读取请求体和响应体(默认不可重复读取):
- 使用
ContentCachingRequestWrapper和ContentCachingResponseWrapper(Spring 提供)可安全获取请求/响应内容 - 若未使用 Spring,需自定义
HttpServletRequestWrapper和HttpServletResponseWrapper实现缓存逻辑 - 记录关键字段:请求时间、HTTP 方法、URI、查询参数、客户端 IP、User-Agent、响应状态码、响应耗时
2. 获取并格式化请求参数
GET 请求参数可通过 request.getQueryString() 或 request.getParameterMap() 获取;POST 表单参数同样可用 getParameterMap();但 JSON 请求体需从输入流读取(需配合 ContentCachingRequestWrapper):
- 调用
wrapper.getContentAsByteArray()获取原始字节,再转为字符串 - 对敏感字段(如 password、token)做脱敏处理,例如用
replaceAll("password=[^&]*", "password=***") - 限制日志长度,避免大文件或超长参数撑爆日志系统
3. 注册 Filter 并配置拦截路径
可通过注解或配置类方式注册(以 Spring Boot 为例):
- 添加
@Component注解使 Filter 被自动扫描 - 用
@Order(Ordered.HIGHEST_PRECEDENCE)确保它最先执行(尤其需要记录完整请求时) - 或在配置类中用
@Bean+FilterRegistrationBean显式注册,并设置setUrlPatterns(Arrays.asList("/*")) - 建议排除静态资源路径(如
/static/**、/actuator/**),减少日志噪音
4. 日志输出与性能注意事项
不要在 Filter 中直接用 System.out.println,应使用 SLF4J + Logback / Log4j2:
- 使用异步日志 Appender(如 Logback 的
AsyncAppender)避免阻塞请求线程 - 记录级别建议设为
INFO,调试时临时调为DEBUG - 高并发场景下,避免记录请求/响应体(尤其是文件上传、大 JSON),可按条件开关(如仅记录错误请求或抽样)
- 记录耗时推荐用
System.nanoTime(),比System.currentTimeMillis()更精确
不复杂但容易忽略。关键是封装好请求/响应读取逻辑,控制好日志粒度和敏感信息,再配合合理注册方式,就能稳定运行在生产环境。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











