lel*_*rir 6 java logback slf4j mdc vaadin
我正在使用Vaadin框架,它对截取事件的支持很少,我不知道会话或UI何时被激活,所以我不能将它们的ID放在MDC中.
通常我会:
public void onSessionBegin(){
    MDC.put("session", VaadinSession.getCurrent().toString()); //<-- String is immutable
}
public void onSessionEnd(){
    MDC.remove("session");
}
但我没有这样的事件,所以我想:
// in the servlet init or wherever
MDC.put("session", new Object(){
        public String toString() {
            VaadinSession.getCurrent().toString()
        };
    }); //<-- This is mutable and will be evaluated each time
这样,无论多少时间都会改变会话,在日志中我会得到当前的一个.
这可能吗?如何使用自定义MDC实现替换logback MDC实现?我应该编辑slf4j和logback的来源吗?
您不想从每个日志行的线程局部变量中检索当前会话(这正是所做的VaadinSession.getCurrent())。API 使用静态字符串类型,因为这是最快的。
Vaadin 实际上有SessionInitListener和SessionDestroyListener,但这也不是您想要的:MDC 是线程本地的,但并非同一会话中的所有请求都在同一线程中处理。因此,您必须在RequestHandler. 我认为 Vaadin 没有用于请求结束的回调接口,因此似乎没有好地方可以清除该值。
更新:在这个答案被接受后,我发现实际上有一种更好的方法来设置和清除该值,这样如果服务器回收不同会话的线程,它就不会包含错误信息。您应该做的是子类化VaadinServletorVaadinPortlet并重写以返回orcreateServletService()的自定义子类,该子类又重写两者并分别设置和删除 MDC 中的值。VaadinServletServiceVaadinPortletServicerequestStart()requestEnd()
| 归档时间: | 
 | 
| 查看次数: | 957 次 | 
| 最近记录: |