跟踪错误日志记录的Java实现

时间:2014-02-05 07:20:11

标签: java logging slf4j

This blog post描述了一种有趣的记录方法:

  

当激活时,如果抛出异常(例如NullPointerException),除了堆栈跟踪之外,还会输出到该点为止的会话的完整跟踪。它的工作原理是为每个会话启动会话日志记录,但只在发生异常时才输出结果。

在任何Java日志框架中是否有它的实现?

1 个答案:

答案 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);
    }
}

这假设每个会话都由专用线程处理。