Log4J und MDC (Mapped Diagnostic Context) mit einem Tomcat Servlet Filter


Log4J und MDC (Mapped Diagnostic Context) mit einem Tomcat Servlet Filter, um Request Informationen wie die JSESSIONID aus zu geben

 

In diesem Artikel beschreibe ich, wie man log4j mit Request Informationen erweitert.

Diese Informationen wie der eingeloggte Benutzer oder die SessionId werden nicht als Logmessage ausgegeben, sondern im Pattern, über das die Ausgabe von Log4J konfiguriert werden kann.

Diese Funktionalität nennt sich :  MDC (Mapped Diagnostic Context).

Das Grundkonzept dahinter ist so einfach wie genial. Innerhalb einer Java Anwendung können wir alle Informationen in die MDC schreiben, auf die Log4j dann zugreifen kann.

Das Konzept hinter MDC ist ein „Key – Value Store“, in dem Informationen gespeichert werden, auf die Log4J dann über den Key zugreifen kann.

Diese Funktionalität kann aus jeder Java Anwendung, die log4j importiert, genutzt werden.

In diesem Artikel beschreibe ich jedoch den Weg, wie man innerhalb einer Webanwendung auf Request Parameter per Servlet Filter zugreift, um sie dann, unabhängig von der Business Logik, Log4J zur Verfügung zu stellen.

Dazu benötigen wir verschiedene Einstellungen, die im folgenden erklärt werden.

  • Eine Java Klasse, die als Servlet Filter fungiert.
  • Die web.xml, um diesen Servlet Filter zu aktivieren.
  • Die log4j.properties, um im Pattern die entsprechenden Values aus zu geben.

Die Java Klasse, die den Request filtert.

package lh.it.servlet.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.MDC;

public class MDCServletFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        String userId = "";
        String sessionId = "";
 	if(request.getParameter("user") != null) {
		userId = request.getParameter("user");
	}
        HttpSession session = HttpServletRequest.getSession();
        sessionId=session.getId();
	try {
            MDC.put("sessionId", sessionId);
            MDC.put("userId",userId);
        } catch (Exception e {
            ;
        }
    }
}

Die Definition des Filters in der web.xml ( am Ende einfügen )

    

        MDCServletFilter
        lh.it.servlet.filter.MDCServletFilter

        MDCServletFilter
        /*

und die Einstellungen in der log4j.properties, die in diesem Fall in catalina.out loggen würden.

log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern = [%d{ISO8601}] %-5p %c  - %X{userId} - %X{sessionId} - %m%n

log4j.rootLogger = DEBUG, consoleAppender
[2014-03-08 09:02:03,134] INFO - USER - SESSIONID -KLASSENNAME