Tag-Archive for » log4j «

Oct
21
Handbook issued to passengers on Campania

Image via Wikipedia

We needed different log files for a common web project, this gateway project simply loads web services dynamically and generates the wsdd files at runtime, but the problem was huge size of the common log file used by all services. So we needed different log files for different services.

Here is the step by step solution to separate&customize the log files:

  • The first step is adding a filter to web.xml file so we can set the service names:
    <filter>
    <filter-name>WSLoggerFilter</filter-name>
    <filter-class>com.logger.WSLoggerFilter</filter-class>
    <description></description>
    </filter>
    
    <filter-mapping>
    <filter-name>WSLoggerFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  • Here is the simple filter – WSLoggerFilter.java:
    public final class WSLoggerFilter implements Filter {
    private static final String SERVICE_NAME = "serviceName";
    
    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {
    String[] url = ((HttpServletRequest)request).getRequestURI().split("/");
    MDC.put(SERVICE_NAME, url != null ? url[url.length - 1] : "");
    // Forward the request to the next resource in the chain
    chain.doFilter(request, response);
    MDC.remove(SERVICE_NAME);
    }  .....
    
  • The next step is adding a custom adapter that uses the MDC “serviceName” parameter to separate the log files, we just alter the name of the default logging file by adding the serviceName parameter we set at the filter. We add the custom adapter to the log4j.properties file:
    # custom file appender
    log4j.appender.F=com.logger.WSLoggerAppender
    log4j.appender.F.mdcName=serviceName
  • Next step is implementing the custom appender. I used DailyRollingFileAppender to change the name of the logging file, simply by adding service name. Simply do not forget to override close method to close all the appenders we used. The custom adapter file WSLoggerAppender.java:
    public class WSLoggerAppender extends DailyRollingFileAppender {
    private String mdcName;
    
    private Map<string, dailyrollingfileappender=""> map = new HashMap<string, dailyrollingfileappender="">();
    
    @Override
    public synchronized void doAppend(LoggingEvent event) {
    Object key = MDC.get(getMdcName());
    if (key == null) {
    super.doAppend(event);
    return;
    }
    String serviceName = key.toString();
    if (serviceName != null &amp;&amp; serviceName.length() > 0 &amp;&amp; !map.containsKey(serviceName)) {
    try {
    DailyRollingFileAppender dailyRollingFileAppender = new DailyRollingFileAppender(layout, fileName + "." + serviceName, getDatePattern());
    map.put(serviceName, dailyRollingFileAppender);
    } catch (IOException e) {
    }
    }
    DailyRollingFileAppender ap = (DailyRollingFileAppender) map.get(serviceName);
    if (ap != null)
    ap.doAppend(event);
    else
    super.append(event);
    }
    
    @Override
    public void close() {
    for (Iterator iter = map.values().iterator(); iter.hasNext();) {
    DailyRollingFileAppender appender = (DailyRollingFileAppender) iter.next();
    appender.close();
    }
    super.close();
    }
    
    public void setMdcName(String mdcName) {
    this.mdcName = mdcName;
    }
    
    public String getMdcName() {
    return mdcName;
    }
    }

That was all!

Reblog this post [with Zemanta]