简体   繁体   English

javalite Activeweb如何在HttpSupportFilter中获取用于记录目的的响应正文字符串

[英]javalite Activeweb how to get response body string for logging purpose in HttpSupportFilter

How to get responseBody string for logging purpose in HttpSupportFilter ?如何在HttpSupportFilter中获取用于记录目的的responseBody字符串?

Common log solution is create wrapper and insert it to the standar filter常见的日志解决方案是创建包装器并将其插入标准过滤器

If we use standar filter we cannot access activejdbc db connection layer如果我们使用标准过滤器,我们将无法访问 activejdbc db 连接层

I tried to apply wrapper but it does not work, the string is still empty我试图应用包装器,但它不起作用,字符串仍然是空的

public class HTTPLogFilter extends HttpSupportFilter {

    private static ThreadLocal<Long> start = new ThreadLocal<>();
    
    @Override
    public void before() {
        start.set(System.currentTimeMillis());
    }

    @Override
    public void after() {

        if(Configuration.HTTPLOGS_ENABLE) {

            Registry.instance().getStatisticsQueue().enqueue(
                    new QueryExecutionEvent(getRoute().getController().getClass().getName() +
                            "#" + getRoute().getActionName() + ":" + method(), System.currentTimeMillis() - start.get()));

            HttpLog httpLog = new HttpLog();

            String username ="TEST";

            Map request = new HashMap<String, Object>();
            request.put("requestUrl", url());
            request.put("contextPath", context());
            request.put("uriFullPath", uri());
            request.put("uriPath", path());
            request.put("method", method());
            request.put("requestHeaders", headers());
            request.put("requestParams", params());
            request.put("queryString", queryString());
            request.put("requestBody", getRequestString());

            Map response = new HashMap<String, Object>();
            response.put("responseHeaders", getResponseHeaders());
            try {
                // BUG ! this responseBody still empty
                response.put("responseBody", getHttpServletResponse().getWriter().toString());
            } catch (IOException e) {
                e.printStackTrace();
            }

            httpLog.setCreatedby(username);
            httpLog.setCreateddt(new Date());
            httpLog.setUsername(username);
            String remoteAddr = ipForwardedFor() != null ? ipForwardedFor() : remoteAddress();
            httpLog.setIpaddress(remoteAddr );
            httpLog.setUseragent(userAgent());
            httpLog.setControllername(getRoute().getController().getClass().getName() + "." + getRoute().getActionName());
            httpLog.setHttpmethod(method());
            httpLog.setHttpexceptions("");
            httpLog.setExecutiondt(new Date(start.get()));
            httpLog.setExecutiondur(System.currentTimeMillis() - start.get());
            httpLog.setHttpurl(url());
            httpLog.setHttprequest(JsonHelper.toJson(request));
            httpLog.setHttpresponse(JsonHelper.toJson(response));
            httpLog.setHttpstatuscode(getHttpServletResponse().getStatus());
            httpLog.saveIt();
        }
    }

}

generally, you are on the right path.一般来说,你是在正确的道路上。 It is my understanding that HttpLog is a model, and you want to store the request values that to database, correct?据我了解, HttpLog是 model,并且您想将请求值存储到数据库中,对吗?

You write:你写:

if we use standar filter we cannot access activejdbc db connection layer如果我们使用标准过滤器,我们将无法访问 activejdbc 数据库连接层

So, the ActiveWeb filters have ordering, which is documented here: https://javalite.io/controller_filters#filter-ordering因此,ActiveWeb 过滤器具有排序,此处记录: https://javalite.io/controller_filters#filter-ordering

This means that if you want a database connection available in the HTTPLogFilter , you have to register the DBConnectionFilter before the HTTPLogFilter , example:这意味着如果您想要在HTTPLogFilter中提供数据库连接,则必须在HTTPLogFilter之前注册DBConnectionFilter ,例如:

public class AppControllerConfig extends AbstractControllerConfig {
    public void init(AppContext appContext) {
        add(new DBConnectionFilter(), new HTTPLogFilter());
    }
}

This way, the DBConnectionFilter.before() will be called before the HTTPLogFilter.before() and will open a DB connection accordingly.这样, DBConnectionFilter.before()将在HTTPLogFilter.before()之前被调用,并相应地打开一个 DB 连接。

On the side note: you will be filling your database pretty quickly, and a recommendation is to simply log all this data to a log file and use a log analyzer like Splunk or Graylog.附带说明:您将很快填充数据库,建议将所有这些数据简单地记录到日志文件中,并使用 Splunk 或 Graylog 等日志分析器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM