001/** 002 * Logback: the reliable, generic, fast and flexible logging framework. 003 * Copyright (C) 1999-2015, QOS.ch. All rights reserved. 004 * 005 * This program and the accompanying materials are dual-licensed under 006 * either the terms of the Eclipse Public License v1.0 as published by 007 * the Eclipse Foundation 008 * 009 * or (per the licensee's choosing) 010 * 011 * under the terms of the GNU Lesser General Public License version 2.1 012 * as published by the Free Software Foundation. 013 */ 014package ch.qos.logback.classic.selector.servlet; 015 016import java.io.IOException; 017 018import javax.servlet.Filter; 019import javax.servlet.FilterChain; 020import javax.servlet.FilterConfig; 021import javax.servlet.ServletException; 022import javax.servlet.ServletRequest; 023import javax.servlet.ServletResponse; 024 025import org.slf4j.LoggerFactory; 026 027import ch.qos.logback.classic.LoggerContext; 028import ch.qos.logback.classic.selector.ContextJNDISelector; 029import ch.qos.logback.classic.selector.ContextSelector; 030import ch.qos.logback.classic.util.ContextSelectorStaticBinder; 031 032/** 033 * A servlet filter that puts the environment dependent LoggerContext in a 034 * ThreadLocal variable, removing it after the request is processed. 035 * 036 * <p> 037 * To use it, add the following lines to a web.xml file 038 * 039 * <filter> <filter-name>LoggerContextFilter</filter-name> <filter-class> 040 * ch.qos.logback.classic.selector.servlet.LoggerContextFilter </filter-class> 041 * </filter> <filter-mapping> <filter-name>LoggerContextFilter</filter-name> 042 * <url-pattern>/*</url-pattern> </filter-mapping> 043 * 044 * @author Sébastien Pennec 045 */ 046public class LoggerContextFilter implements Filter { 047 048 public void destroy() { 049 // do nothing 050 } 051 052 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 053 throws IOException, ServletException { 054 055 LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 056 ContextSelector selector = ContextSelectorStaticBinder.getSingleton().getContextSelector(); 057 ContextJNDISelector sel = null; 058 059 if (selector instanceof ContextJNDISelector) { 060 sel = (ContextJNDISelector) selector; 061 sel.setLocalContext(lc); 062 } 063 064 try { 065 chain.doFilter(request, response); 066 } finally { 067 if (sel != null) { 068 sel.removeLocalContext(); 069 } 070 } 071 } 072 073 public void init(FilterConfig arg0) throws ServletException { 074 // do nothing 075 } 076}