java.util.logging在每个日志条目中包含jSessionId
我在应用程序中使用j2se记录器。java.util.logging在每个日志条目中包含jSessionId,java,jakarta-ee,java.util.logging,Java,Jakarta Ee,Java.util.logging,我在应用程序中使用j2se记录器。 是否有任何方法可以在不修改当前日志语句的情况下使用日志文件中的每个日志条目记录jSessionId。我找到了解决方案。这可以通过ThreadLocal、servlet过滤器和日志过滤器来完成。具体步骤如下: 使用ThreadLocal变量创建会话id持有者类: public abstract class SessionUtil { private static final ThreadLocal<String> sessionIdThr
是否有任何方法可以在不修改当前日志语句的情况下使用日志文件中的每个日志条目记录jSessionId。我找到了解决方案。这可以通过ThreadLocal、servlet过滤器和日志过滤器来完成。具体步骤如下: 使用ThreadLocal变量创建会话id持有者类:
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类的doFilter()方法中,添加以下行以将JSessionId添加到ThreadLocal:
SessionUtil.setSessionId(request.getSession(false).getId());
在ServletFilter类中doFilter()方法的finally块中,添加以下行以在处理请求后从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
[4/12/13 10:00:46:685 EDT] 00000020 SampleClass I com.example.SampleClass sampleMethod() [ROatVgqdnLd-ls3_ONvXcXU] Sample message