簡體   English   中英

javalite Activeweb如何在HttpSupportFilter中獲取用於記錄目的的響應正文字符串

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

如何在HttpSupportFilter中獲取用於記錄目的的responseBody字符串?

常見的日志解決方案是創建包裝器並將其插入標准過濾器

如果我們使用標准過濾器,我們將無法訪問 activejdbc db 連接層

我試圖應用包裝器,但它不起作用,字符串仍然是空的

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();
        }
    }

}

一般來說,你是在正確的道路上。 據我了解, HttpLog是 model,並且您想將請求值存儲到數據庫中,對嗎?

你寫:

如果我們使用標准過濾器,我們將無法訪問 activejdbc 數據庫連接層

因此,ActiveWeb 過濾器具有排序,此處記錄: https://javalite.io/controller_filters#filter-ordering

這意味着如果您想要在HTTPLogFilter中提供數據庫連接,則必須在HTTPLogFilter之前注冊DBConnectionFilter ,例如:

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

這樣, DBConnectionFilter.before()將在HTTPLogFilter.before()之前被調用,並相應地打開一個 DB 連接。

附帶說明:您將很快填充數據庫,建議將所有這些數據簡單地記錄到日志文件中,並使用 Splunk 或 Graylog 等日志分析器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM