Ever wondered how to add additional session related info in log4j logging?
I like to see logged in user, along with session-id info in logging messages in applications, where analyzing secure operations becomes critical (healthcare, financial apps).
Here’s a sample filter log4j’s MDC to add diagnostic context in log messages.
package com.cramer.srf.web.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.HttpServletRequest;
import org.apache.log4j.MDC;
import com.cramer.srf.util.SRFUtils;
/**
* Filter that adds user session info in log4j MDC (Mapped Diagnoistic Context)
*
*/
public class Log4jSessionFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
if (request instanceof HttpServletRequest) {
if (SRFUtils.getLoggedUser() != null) {
MDC.put("user", SRFUtils.getLoggedUser());
}
}
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
// NO OP
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// NO OP
}
}
The corresponding log4j file. Note ‘[%X{user}]‘ in the ConversionPattern below.
<!-- File appender -->
<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="logs/rx.log" />
<param name="Append" value="true"
<param name="DatePattern" value="'.'yyyy-ww" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%X{user}] [%t:%X{SESSION}] %c - %m%n" />
</layout>
</appender>
2 Comments
Thanks a lot for the sample regarding the Web Filter and you given information is very useful for the users.
MDC logs only data per thread. When I try to login, the data is posted to one thread and not every thread that the container creates.
Post a Comment