This blog post描述了一种有趣的记录方法:
当激活时,如果抛出异常(例如NullPointerException),除了堆栈跟踪之外,还会输出到该点为止的会话的完整跟踪。它的工作原理是为每个会话启动会话日志记录,但只在发生异常时才输出结果。
在任何Java日志框架中是否有它的实现?
答案 0 :(得分:2)
不是我所知道的,但是很有可能编写一个委托给相应会话日志的自定义appender。对于Logback,这可能类似于:
class SessionLogAppender implements Appender<ILogEvent> {
private static final TheadLocal<Object> sessionHolder = new ThreadLocal<Object>();
private Map<Object, SessionLog> sessionLogs = new ConcurrentHashMap<>();
/** must be invoked when a new session begins */
public static void begin(Object session) {
sessionHolder.set(session);
}
/** must be invoked when a session ends */
public static void end() {
Object session = sessionHolder.get();
writeIfNecessary(sessionLogs.get(session));
sessionLogs.remove(session);
sessionHolder.clear();
}
@Override
public void doAppend(ILogEvent e) {
Object session = sessionHolder.get();
SessionLog l = sessionLogs.get(session);
if (l == null) {
l = new SessionLog();
sessionLogs.put(session, l);
}
l.append(e);
}
}
这假设每个会话都由专用线程处理。