2013-02-27 62 views

回答

0

我为此得到了解决方案。这可以通过使用ThreadLocal,一个servlet过滤器和一个日志过滤器来完成。的步骤如下:

创建ThreadLocal变量的会话ID holder类:

public abstract class SessionUtil { 
     private static final ThreadLocal<String> sessionIdThreadLocal = new ThreadLocal<String>(); 
     public static String getSessionId() { 
      return sessionIdThreadLocal.get(); 
     } 
     public static void setSessionId(String jSessionId) { 
      sessionIdThreadLocal.set(jSessionId); 
     } 
     public static void removeSessionId() { 
      sessionIdThreadLocal.remove(); 
     } 
} 

创建ServletFilter中和ServletFilter中类的init()方法的内部,与所述记录处理机连接日志过滤器:

Handler[] handlers = Logger.getLogger("").getHandlers(); 
for (Handler handler : handlers) { 
LogFilter logFilter = new MyLogFilter(); 
handler.setFilter(logFilter); 
} 

里面ServletFilter中类的doFilter()方法中,添加以下行JSESSIONID添加的ThreadLocal:

SessionUtil.setSessionId(request.getSession(false).getId()); 

内部的doFilter()在ServletFilter中类方法的最后块中,添加以下线路从ThreadLocal的除去JSESSIONID的请求被处理之后:

SessionUtil.removeSessionId(); 

定义日志过滤器类:

public class MyLogFilter implements LogFilter { 
    public boolean isLoggable(LogRecord record) { 
    if (SessionUtil.getSessionId() != null && 
      !SessionUtil.getSessionId().toString().equals("")) { 
     StringBuilder sessId = new StringBuilder(SessionUtil.getSessionId().toString()); 
     String methodName = record.getSourceMethodName(); 
      if (methodName != null && !methodName.equals("")) { 
      if (!methodName.endsWith(sessId.toString())) { 
        record.setSourceMethodName(sessId.insert(0, " ").insert(0, methodName).toString()); 
      } 
      } else { 
      record.setSourceMethodName(sessId.toString()); 
      } 
    } 
     return true; 
    } 
} 

现在样本日志条目将如下:

[4/12/13 10:00:46:685 EDT] 00000020 SampleClass I com.example.SampleClass sampleMethod() [ROatVgqdnLd-ls3_ONvXcXU] Sample message 
相关问题