<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
public class LogFilter implements Filter
{
private static Log logger = LogFactory.getLog(LogFilter.class);
private TreeMap<Long, String> classification = new TreeMap<Long, String>(
new Comparator()
{
public int compare(Long obj1, Long obj2)
{
return obj2.compareTo(obj1);
}
});
@Override
public void destroy()
{
classification.clear();
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
long beforeTime = System.currentTimeMillis();
chain.doFilter(request, response);
long afterTime = System.currentTimeMillis();
long takeTime = afterTime - beforeTime;
Long minClassificationTime = classification.lastEntry().getKey();
// if takes time(unit is ms) is less than minimum classification, directly return in view of performance
if (takeTime < minClassificationTime)
{
return;
}
StringBuffer sb = new StringBuffer();
Set<Long> keySet = classification.keySet();
Iterator<Long> iter = keySet.iterator();
while (iter.hasNext())
{
Long key = iter.next();
if (takeTime >= key)
{
sb.append(classification.get(key));
break;
}
}
StringBuffer url = ((HttpServletRequest)request).getRequestURL();
if (StringUtils.isNotBlank(sb.toString()))
{
HttpSession session = ((HttpServletRequest)request).getSession();
String id = session.getId();
if( StringUtils.isNotEmpty(id))
{
logger.warn("[LongRunningRequest:SessionId ="+session.getId()+" "+ sb + "] [Length:" + takeTime + "ms] URL: " + url);
}else
{
logger.warn("[LongRunningRequest:no session" + sb + "] [Length:" + takeTime + "ms] URL: " + url);
}
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
String setting = null;
try
{
setting = filterConfig.getInitParameter("setting");
String[] loggingRules = setting.split(",");
for (String rule : loggingRules)
{
String[] classificationArray = rule.split(":");
// such as 4000(ms): warn
classification.put(Long.valueOf(classificationArray[0]), classificationArray[1]);
}
} catch (Exception e)
{
logger.error("The setting '" + setting + "' of LogFilter is not correct in SalesToolAPI/web.xml" + e);
}
}
}