![](/img/trans.png)
[英]How to return raw response from JavaLite.io activeweb controller
[英]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.