2

I would like to be able to debug specific requests on my server. I already followed KC Baltz's response on Conditional logging with log4j to log requests of interest to their own log file.

When starting to process a request:

FileAppender fileAppender = new FileAppender(new PatternLayout(pattern), logFileName, true);
fileAppender.setName(sessionId);
fileAppender.setThreshold(Level.TRACE);

// Add a filter to identify logs belonging to the current thread
fileAppender.addFilter(new MyCustomFilter(sessionId));
Logger.getRootLogger.addAppender(fileAppender);

// Use log4j MDC to identify logs
MDC.put("log-key", sessionId);

Then after the request is done processing:

Appender appender = Logger.getRootLogger().getAppender(sessionId);
Logger.getRootLogger().removeAppender(appender);
MDC.remove("log-key");

The corresponding filter:

public class MyCustomFilter extends Filter {
    private final String id;

    public MyCustomFilter(String id) {
        this.id = id;
    }

    @Override
    public int decide(LoggingEvent event) {
        Object mdc = event.getMDC("log-key");
        if (id.equals(mdc)) {
            return Filter.ACCEPT;
        }
        return Filter.DENY;
    }
}

The problem is that the level of the root logger is set to 'WARN' and I want to the get all the logs (TRACE level) for the given sessionId.

Community
  • 1
  • 1
CrazyDoggg
  • 463
  • 5
  • 16

0 Answers0