Grails 记录Http请求和响应正文

Grails 记录Http请求和响应正文,grails,groovy,Grails,Groovy,我试图弄清楚如何记录进入我的应用程序的每个请求及其相关响应。目前,我已经创建了一个Grails拦截器来捕获请求和响应。我经常遇到的问题是,如果我在请求主体到达控制器之前记录它,那么资源就会被我的记录器消耗,请求主体为null。因此,我尝试在控制器处理请求正文之后记录它。问题是输入流被关闭,我无法再访问它 这是我的拦截器: import grails.plugin.springsecurity.SpringSecurityService import javax.servlet.ServletR

我试图弄清楚如何记录进入我的应用程序的每个请求及其相关响应。目前,我已经创建了一个Grails拦截器来捕获请求和响应。我经常遇到的问题是,如果我在请求主体到达控制器之前记录它,那么资源就会被我的记录器消耗,请求主体为null。因此,我尝试在控制器处理请求正文之后记录它。问题是输入流被关闭,我无法再访问它

这是我的拦截器:

import grails.plugin.springsecurity.SpringSecurityService

import javax.servlet.ServletRequest

class HttpLoggingInterceptor {

SpringSecurityService springSecurityService
HttpLoggingService httpLoggingService


HttpLoggingInterceptor() {
    match(controller: "*")
}

 boolean before() {
    httpLoggingService.logRequest(request, response, springSecurityService.principal)
    true
  } 
}
这是httpLoggingService:

import grails.transaction.Transactional
import org.apache.commons.io.IOUtils
import org.springframework.security.core.userdetails.User

import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletRequestWrapper
import javax.servlet.http.HttpServletResponse
import java.nio.charset.StandardCharsets

@Transactional
class HttpLoggingService {

static final String CR = "\r\n"

def logRequest(HttpServletRequestWrapper request, HttpServletResponse response, User user) {


    log.debug("REQUEST:${CR}" +
            "Request  URL: ${request?.method} ${request?.requestURL}${CR}" +
            "Request  QueryString: ${request?.queryString}${CR}" +
            "Request Body : ${getRequestBody(request)}" +
            "Request  Client IP: ${request?.remoteAddr}${CR}" +
            "Request  User: ${getUserInfo(user)}${CR}" +
            "Request  Headers: ${getRequestHeaders(request)}${CR}" +
            "Request  Query String Parameters:         ${getRequestParameters(request)}${CR}" +
        "Response Status: ${response?.status}${CR}" +
        "Respones Body: ${getResponseBody(response)}" +
        "Response Properties: ${response?.properties}${CR}" +
        "Response Headers: ${getResponseHeaders(response)}${CR}" +
        CR
    )
}


private String getUserInfo(User user) {
    String userInfo = null
    if (user instanceof CipUserDetails) {
        userInfo = "${user?.username} [${user?.fullName}] - ${user?.authorities[0]?.role}"
    }
    userInfo
}

private String getRequestBody(HttpServletRequestWrapper request) {
    String requestBody = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8)
    requestBody
}

private String getRequestParameters(HttpServletRequest request) {
    Map parameterMap = request?.parameterMap
    String parameterString = ""
    for (String name : request?.parameterNames) {
        parameterString += "${CR}    ${name}=${parameterMap?.get(name)}"
    }
    parameterString
}

private String getRequestHeaders(HttpServletRequest request) {
    String parameterString = ""
    for (String name : request.headerNames) {
        parameterString += "${CR}    ${name}=${request?.getHeader(name)}"
    }
    parameterString
}

private String getResponseHeaders(HttpServletResponse response) {
    String parameterString = ""
    for (String name : response?.headerNames) {
        parameterString += "${CR}    ${name}=${response?.getHeader(name)}"
    }
     parameterString
 }
}

有人能帮我想一想怎么做吗?

我不知道怎么做,所以只是一些评论,而不是一个实际的答案!第一条评论:注意这样的安全问题;如果你有密码的话,你最终会记录密码之类的东西!第二条评论:这可能是apache或tomcat或您正在使用的任何服务器更擅长做的事情,而不是grails。至少,它们的设计能够做到这一点,而不会影响性能或以任何方式改变请求/响应。谢谢,我将研究tomcat提供了什么!问题与以下类似: