{"id":910,"date":"2018-09-17T18:17:23","date_gmt":"2018-09-17T09:17:23","guid":{"rendered":"https:\/\/chat-messenger.com\/?p=910"},"modified":"2018-12-23T02:01:26","modified_gmt":"2018-12-22T17:01:26","slug":"http-log-filter","status":"publish","type":"post","link":"https:\/\/chat-messenger.com\/en\/blog\/java\/http-log-filter","title":{"rendered":"Parsing HTTP with Java Log Filter"},"content":{"rendered":"<h2 class=\"common_title\"><a name=\"0\">Analyze HTTP requests with Java log filter<\/a><\/h2>\n<p>\n<strong>javax.servlet.Filter<\/strong>to implement a convenient way to parse the contents of HTTP requests and output logs.<strong>Filter<\/strong>Classes.<br \/>\n<br \/>\nThis log filter uses \"java.util.logging.Logger\" for log output, and the information output can be changed by changing the log level.\n<\/p>\n<h2 class=\"common_title\"><a name=\"1\">What is javax.servlet.Filter?<\/a><\/h2>\n<p>\nWhen building a web application, in addition to the main business processing, it is necessary to perform common secondary processing before and after the main business processing.<br \/>\nFor example, client authentication, authority checking, logging, etc.<br \/>\nCoding such side processing in each resource becomes a major cause of hindering software maintainability, resulting in an application that is difficult to maintain.<\/p>\n<p>If you implement javax.servlet.Filter, you can have this secondary process commonly performed before the request is passed to the servlet class.<br \/>\nFilters can be configured in web.xml, giving you the flexibility to add or remove filters without changing the source code.\n<\/p>\n<p><script type=\"text\/javascript\" src=\"https:\/\/chat-messenger.com\/js\/common.js?dd12sssas2223\" charset=\"UTF-8\"><\/script><br \/>\n<script type=\"text\/javascript\"> writePR(); <\/script><\/p>\n<h2 class=\"common_title\"><a name=\"2\">Try using log filters<\/a><\/h2>\n<p>Let's actually use the log filter to analyze HTTP requests by passing filters through HTTP requests.<br \/>\nIn this issue.<a href=\"http:\/\/tomcat.apache.org\/\" target=\"_blank\">Tomcat<\/a>The examples application is available from the beginning in the<br \/>\nThis filter can be run immediately with the following settings<\/p>\n<div class=\"point\">\n1.<a href=\"#4\"><strong>source code<\/strong><\/a>and compile.<br \/>\n2. Place the compiled class files under \"\/examples\/WEB-INF\/classes\".<br \/>\n3. Set the following definitions in web.xml.\n<\/div>\n<pre class=\"sample_src\">  LogFilter\r\n   LogFilter\r\n   \r\n    logging.Level\r\n    FINE\r\n   \r\n  \r\n  \r\n   LogFilter\r\n   \/*\r\n<\/pre>\n<p>The url-pattern when using the Struts framework is as follows.<\/p>\n<pre class=\"sample_src\">   *.do\r\n<\/pre>\n<p>\nCheck the log output results of running the Sessions Example screen.<br \/>\n<img src=\"https:\/\/chat-messenger.com\/images\/SessionsExample.jpg\" alt=\"Web application analysis with javax.servlet.Filter log filter\" border=\"0\"><br \/>\n<br clear=\"all\"><\/p>\n<h2 class=\"common_title\"><a name=\"3\">Output log information and log level<\/a><\/h2>\n<p><strong>Log output contents<\/strong><\/p>\n<table border=\"1\">\n<tbody>\n<tr bgcolor=\"#FFFF80\">\n<th>log information<\/th>\n<th>log level<\/th>\n<\/tr>\n<tr>\n<td><strong>Cookie Information<\/strong><\/td>\n<td>fine<\/td>\n<\/tr>\n<tr>\n<td><strong>HTTP Header Information<\/strong><\/td>\n<td>fine<\/td>\n<\/tr>\n<tr>\n<td><strong>HTTP and other information<\/strong><\/td>\n<td>fine<\/td>\n<\/tr>\n<tr>\n<td><strong>HTTP Request Parameters<\/strong><\/td>\n<td>CONFIG<\/td>\n<\/tr>\n<tr>\n<td><strong>Objects in the request scope<\/strong><\/td>\n<td>CONFIG<\/td>\n<\/tr>\n<tr>\n<td><strong>Session Scope Objects<\/strong><\/td>\n<td>CONFIG<\/td>\n<\/tr>\n<tr>\n<td><strong>Memory usage before and after request<\/strong><\/td>\n<td>CONFIG<\/td>\n<\/tr>\n<tr>\n<td><strong>Screen transition information<\/strong><\/td>\n<td>INFO<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n<p>Log levels should be used as follows<\/p>\n<ul>\n<li>FINE: Outputs the most detailed logs; set this if you want to analyze HTTP requests in detail.<\/li>\n<li>CONFIG ... Outputs a somewhat detailed log. It is recommended to keep this level during the development period.<\/li>\n<li>INFO\u30fb\u30fb\u30fb\u30fb outputs screen transition information only.<\/li>\n<\/ul>\n<p><strong>How to change the log level<\/strong><br \/>\nThe logging output level can be changed by setting the initialization parameter logging.Level.<br \/>\nExample:<\/p>\n<pre class=\"sample_src\">   logging.Level\r\n    INFO\r\n<\/pre>\n\n<h2 class=\"common_title\"><a name=\"4\">source code<\/a><\/h2>\n<p><textarea readonly=\"readonly\" style=\"font-size: 13px;height: 400px;\" class=\"src\" onclick=\"this.focus();this.select()\">import java.io.IOException;<br \/>\nimport java.io.UnsupportedEncodingException;<br \/>\nimport java.sql.Time;<br \/>\nimport java.text.DecimalFormat;<br \/>\nimport java.text.SimpleDateFormat;<br \/>\nimport java.util.Date;<br \/>\nimport java.util.Enumeration;<br \/>\nimport java.util.Hashtable;<br \/>\nimport java.util.Iterator;<br \/>\nimport java.util.Map;<br \/>\nimport java.util.TreeMap;<br \/>\nimport java.util.logging.Formatter;<br \/>\nimport java.util.logging.Handler;<br \/>\nimport java.util.logging.Level;<br \/>\nimport java.util.logging.LogManager;<br \/>\nimport java.util.logging.LogRecord;<br \/>\nimport java.util.logging.Logger;<br \/>\nimport java.util.logging.StreamHandler;<\/p>\n<p>import javax.servlet.Filter;<br \/>\nimport javax.servlet.FilterChain;<br \/>\nimport javax.servlet.FilterConfig;<br \/>\nimport javax.servlet.ServletException;<br \/>\nimport javax.servlet.ServletRequest;<br \/>\nimport javax.servlet.ServletResponse;<br \/>\nimport javax.servlet.http.Cookie;<br \/>\nimport javax.servlet.http.HttpServletRequest;<br \/>\nimport javax.servlet.http.HttpServletResponse;<br \/>\nimport javax.servlet.http.HttpSession;<\/p>\n<p>\/**<br \/>\n * Implement javax.servlet.Filter to analyze the content of HTTP requests and output logs<br \/>\n * Filter class.<br \/>\n *\/<br \/>\npublic class LogFilter implements Filter {<\/p>\n<p>    private static Logger logger =<br \/>\n        Logger.getLogger(LogFilter.class.getName());<br \/>\n    private static final String LINE_SEPA =<br \/>\n        System.getProperty(\u201cline.separator\u201d);<br \/>\n    private static final String NEXT_PAGE = \u201cLogFilter.NEXT_PAGE\u201d;<\/p>\n<p>    \/**<br \/>\n     * Initialize this log filter.<br \/>\n     * @param mapping<br \/>\n     *\/<br \/>\n    public void init(FilterConfig mapping) {<br \/>\n        String str = mapping.getInitParameter(\u201clogging.Level\u201d);<br \/>\n        System.out.println(\u201cSet log level to \u201c+str+\u201d.\u201d);<br \/>\n        Level level = null;<br \/>\n        try {<br \/>\n            level = Level.parse(str);<br \/>\n        } catch (Exception e) {<br \/>\n            e.printStackTrace();<br \/>\n            level = Level.INFO;<br \/>\n        }<br \/>\n        LogManager.getLogManager().reset();<br \/>\n        Handler handler = new CustomConsoleHandler();<br \/>\n        handler.setFormatter(new CustomFormatter());<br \/>\n        handler.setLevel(level);<br \/>\n        logger.setLevel(level);<br \/>\n        logger.getParent().addHandler(handler);<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     * This is a filter that outputs logs.<br \/>\n     * @param request HTTP request being processed<br \/>\n     * @param response HTTP response being generated<br \/>\n     * @param chain<br \/>\n     *\/<br \/>\n    public void doFilter(ServletRequest _request, ServletResponse _response,<br \/>\n            FilterChain chain) throws IOException, ServletException {<\/p>\n<p>        \/\/ --------------------&quot; Preprocessing &quot;<br \/>\n        HttpServletRequest request = (HttpServletRequest) _request;<br \/>\n        HttpServletResponse response = (HttpServletResponse) _response;<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            logger.config(<br \/>\n                \u201c============ Request Start!!\u201d<br \/>\n                +\u201dThread ID:\u201d<br \/>\n                + Thread.currentThread().hashCode()<br \/>\n                + &#8221; ========================================================&#8221;);<br \/>\n        }<br \/>\n        \/\/ memory usage<br \/>\n        String actionMemory = null;<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            actionMemory = getMemoryInfo(\u201d \u201d<br \/>\n                    + new Time(System.currentTimeMillis()) + \u201dRequest[previous]\u201d);<br \/>\n        }<br \/>\n        if (logger.isLoggable(Level.FINE)) {<br \/>\n            logger.fine(\u201cCookie Information\u201d + getCookieInfo(request));<br \/>\n        }<br \/>\n        if (logger.isLoggable(Level.FINE)) {<br \/>\n            logger.fine(\u201cHTTP header information\u201d + getHeadersInfo(request));<br \/>\n        }<br \/>\n        if (logger.isLoggable(Level.FINE)) {<br \/>\n            logger<br \/>\n                    .fine(\u201cHTTP other information\u201d + getRequestOtherInfo(request));<br \/>\n        }<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            String reqlog = getRequestParametersInfo(request);<br \/>\n            logger.config(\u201cHTTP request parameters\u201d + reqlog);<br \/>\n        }<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            logger.config(\u201crequest scope object\u201d<br \/>\n                    + getRequestAttributeInfo(request));<br \/>\n        }<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            String sessionlog = getSessionInfo(request,true);<br \/>\n            logger.config(\u201csession scope object (before request processing)\u201d<br \/>\n                    + sessionlog);<br \/>\n        }<\/p>\n<p>        \/\/ call next filter<br \/>\n        chain.doFilter(request, response);<\/p>\n<p>        \/\/ \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014- \u201cPost-processing\u201d<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            String sessionlog = getSessionInfo(request,false);<br \/>\n            logger.config(\u201csession scope object (after request processing)\u201d<br \/>\n                    + sessionlog);<br \/>\n        }<br \/>\n        \/\/ memory usage<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            actionMemory = \u201dMemory usage before and after request\u201d+LINE_SEPA<br \/>\n                    + actionMemory + LINE_SEPA<br \/>\n                    + getMemoryInfo(\u201d \u201d + new Time(System.currentTimeMillis())<br \/>\n                            + \u201drequest[after]\u201d);<br \/>\n            logger.config(actionMemory+LINE_SEPA);<\/p>\n<p>        }<br \/>\n        \/\/ Screen transition information<br \/>\n        if (logger.isLoggable(Level.INFO)) {<br \/>\n            String nextPage = (String) request.getAttribute(NEXT_PAGE);<br \/>\n            if (nextPage == null || nextPage.length() == 0) {<br \/>\n                nextPage = request.getRequestURI();<br \/>\n            }<br \/>\n            logger.info(\u201cNEXT_PAGE=[\u201d + nextPage + \u201c], \u201d<br \/>\n                    + \u201cIP_ADDRESS=[\u201d + request.getRemoteAddr() + \u201c], \u201d<br \/>\n                    + \u201cSESSION_ID=[\u201d + request.getSession().getId() + \u201c], \u201d<br \/>\n                    + \u201cUSER-AGENT=[\u201d + request.getHeader(\u201cuser-agent\u201d) + \u201c]\u201d);<br \/>\n        }<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            logger.config(<br \/>\n                \u201c============ Request End!!\u201d<br \/>\n                +\u201dThread ID:\u201d+ Thread.currentThread().hashCode()<br \/>\n                + &#8221; =========================================================&#8221;<br \/>\n                +LINE_SEPA+LINE_SEPA);<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     *<br \/>\n     *\/<br \/>\n    public void destroy() {<br \/>\n    }<\/p>\n<p>    \/\/ \uff0d\uff0d\uff0d\uff0d\uff0d\uff0d\uff0d\uff0d\uff0d\uff0d Private method below \uff0d\uff0d\uff0d\uff0d\uff0d\uff0d\uff0d\uff0d\uff0d\uff0d\uff0d<br \/>\n    private static String getMemoryInfo(String message) {<br \/>\n        DecimalFormat dFromat = new DecimalFormat(\u201c#,###KB\u201d);<br \/>\n        long free = Runtime.getRuntime().freeMemory() \/ 1024;<br \/>\n        long total = Runtime.getRuntime().totalMemory() \/ 1024;<br \/>\n        long max = Runtime.getRuntime().maxMemory() \/ 1024;<br \/>\n        long used = total \u2013 free;<br \/>\n        String msg = message + \u201d : \u201d + \u201ctotal=\u201d + dFromat.format(total) + \u201c, \u201d<br \/>\n                + \u201cUsed amount=\u201d + dFromat.format(used) + \u201d (\u201d + (used * 100 \/ total)<br \/>\n                + \u201c%), maximum available=\u201d + dFromat.format(max);<br \/>\n        return msg;<br \/>\n    }<br \/>\n    \/**<br \/>\n     * Output all request headers to the log.<br \/>\n     *\/<br \/>\n    private static String getHeadersInfo(HttpServletRequest request) {<br \/>\n        StringBuffer buff = new StringBuffer(LINE_SEPA);<br \/>\n        Enumeration headerNames = request.getHeaderNames();<br \/>\n        while (headerNames.hasMoreElements()) {<br \/>\n            String headerName = (String) headerNames.nextElement();<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(headerName);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(request.getHeader(headerName));<br \/>\n            buff.append(LINE_SEPA);<br \/>\n        }<br \/>\n        return buff.toString();<br \/>\n    }<br \/>\n    private static String getCookieInfo(HttpServletRequest request) {<br \/>\n        StringBuffer buff = new StringBuffer();<br \/>\n        Cookie[] cookies = request.getCookies();<br \/>\n        if (cookies == null) {<br \/>\n            return \u201c\u201d;<br \/>\n        }<br \/>\n        for (int i = 0; i &lt; cookies.length; i++) {<br \/>\n            buff.append(\u201c\\n \u2014 Cookie[\u201d + i + \u201c] \u2014\\n\u201d);<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(cookies[i].getName());<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(cookies[i].getValue());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(\u201cgetVersion()\u201d);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(cookies[i].getVersion());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(\u201cgetComment()\u201d);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(cookies[i].getComment());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(\u201cgetDomain()\u201d);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(cookies[i].getDomain());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(\u201cgetMaxAge()\u201d);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(cookies[i].getMaxAge());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(\u201cgetPath()\u201d);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(cookies[i].getPath());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(\u201cgetSecure()\u201d);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(cookies[i].getSecure());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n        }<br \/>\n        return buff.toString();<br \/>\n    }<br \/>\n    private static String getRequestParametersInfo(HttpServletRequest request) {<br \/>\n        StringBuffer buff = new StringBuffer(LINE_SEPA);<br \/>\n        Map map = convertRequest(request);<br \/>\n        TreeMap trr = new TreeMap(map);<br \/>\n        Iterator itr = trr.keySet().iterator();<br \/>\n        while (itr.hasNext()) {<br \/>\n            String key = (String) itr.next();<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(key);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            Object value = map.get(key);<br \/>\n            String[] values = (String[]) value;<br \/>\n            if (values.length == 1) {<br \/>\n                buff.append(values[0]);<br \/>\n            } else {<br \/>\n                \/\/ String array is converted<br \/>\n                String strValue = stratum(values);<br \/>\n                buff.append(strValue);<br \/>\n            }<br \/>\n            buff.append(LINE_SEPA);<br \/>\n        }<br \/>\n        return buff.toString();<br \/>\n    }<br \/>\n    private static String getRequestAttributeInfo(HttpServletRequest request) {<br \/>\n        StringBuffer buff = new StringBuffer(LINE_SEPA);<br \/>\n        Enumeration e = request.getAttributeNames();<br \/>\n        while (e.hasMoreElements()) {<br \/>\n            String name = (String) e.nextElement();<br \/>\n            buff.append(\u201d name=\u201d + name + \u201c, attributeClass= \u201d<br \/>\n                    + request.getAttribute(name).getClass().getName()<br \/>\n                    + \u201c, toString() = \u201d + request.getAttribute(name)<br \/>\n                    + LINE_SEPA);<br \/>\n        }<br \/>\n        return buff.toString();<br \/>\n    }<br \/>\n    private static String getRequestOtherInfo(HttpServletRequest request) {<br \/>\n        StringBuffer buff = new StringBuffer();<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetCharacterEncoding()=\u201d);<br \/>\n        buff.append(request.getCharacterEncoding());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetContentLength()=\u201d);<br \/>\n        buff.append(request.getContentLength());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetContentType()=\u201d);<br \/>\n        buff.append(request.getContentType());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetLocale()=\u201d);<br \/>\n        buff.append(request.getLocale());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetProtocol()=\u201d);<br \/>\n        buff.append(request.getProtocol());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetRemoteAddr()=\u201d);<br \/>\n        buff.append(request.getRemoteAddr());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetRemoteHost()=\u201d);<br \/>\n        buff.append(request.getRemoteHost());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetScheme()=\u201d);<br \/>\n        buff.append(request.getScheme());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetServerName()=\u201d);<br \/>\n        buff.append(request.getServerName());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetServerPort()=\u201d);<br \/>\n        buff.append(request.getServerPort());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201disSecure()=\u201d);<br \/>\n        buff.append(request.isSecure());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetAuthType()=\u201d);<br \/>\n        buff.append(request.getAuthType());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetContextPath()=\u201d);<br \/>\n        buff.append(request.getContextPath());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetMethod()=\u201d);<br \/>\n        buff.append(request.getMethod());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetPathInfo()=\u201d);<br \/>\n        buff.append(request.getPathInfo());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetPathTranslated()=\u201d);<br \/>\n        buff.append(request.getPathTranslated());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetQueryString()=\u201d);<br \/>\n        buff.append(request.getQueryString());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetRemoteUser()=\u201d);<br \/>\n        buff.append(request.getRemoteUser());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetRequestedSessionId()=\u201d);<br \/>\n        buff.append(request.getRequestedSessionId());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetRequestURI()=\u201d);<br \/>\n        buff.append(request.getRequestURI());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetServletPath()=\u201d);<br \/>\n        buff.append(request.getServletPath());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201dgetUserPrincipal()=\u201d);<br \/>\n        buff.append(request.getUserPrincipal());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201disRequestedSessionIdFromCookie()=\u201d);<br \/>\n        buff.append(request.isRequestedSessionIdFromCookie());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201disRequestedSessionIdFromURL()=\u201d);<br \/>\n        buff.append(request.isRequestedSessionIdFromURL());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201disRequestedSessionIdValid()=\u201d);<br \/>\n        buff.append(request.isRequestedSessionIdValid());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        return buff.toString();<br \/>\n    }<\/p>\n<p>    private static String getSessionInfo(HttpServletRequest request,boolean before) {<br \/>\n        HttpSession session = request.getSession();<br \/>\n        StringBuffer buff = new StringBuffer();<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        if (before) {<br \/>\n            buff.append(\u201d session.isNew() = \u201d + session.isNew());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n            buff.append(\u201d session.getId() = \u201d + session.getId());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n        }<br \/>\n        Enumeration e = session.getAttributeNames();<br \/>\n        while (e.hasMoreElements()) {<br \/>\n            String sessionName = (String) e.nextElement();<br \/>\n            String sessionClassName = session.getAttribute(sessionName)<br \/>\n                    .getClass().getName();<br \/>\n            buff.append(\u201d name =\u201d + sessionName + \u201c, value =\u201d<br \/>\n                    + session.getAttribute(sessionName) + \u201c, attributeClass = \u201d<br \/>\n                    + sessionClassName+LINE_SEPA);<br \/>\n        }<br \/>\n        return buff.toString();<br \/>\n    }<\/p>\n<p>    private static Hashtable convertRequest(HttpServletRequest request) {<br \/>\n        Hashtable tempHash = new Hashtable();<br \/>\n        Enumeration e = request.getParameterNames();<br \/>\n        while (e.hasMoreElements()) {<br \/>\n            String key = (String) e.nextElement();<br \/>\n            String[] values = request.getParameterValues(key);<br \/>\n            String[] parameterValues = new String[values.length];<br \/>\n            for (int i = 0; i &lt; values.length; i++) {<br \/>\n                parameterValues[i] = convUnicode(values[i]);<br \/>\n            }<br \/>\n            tempHash.put(key, parameterValues);<br \/>\n        }<br \/>\n        return tempHash;<\/p>\n<p>    }<br \/>\n    private static String stratum(Object value) {<br \/>\n        if (value == null) {<br \/>\n            return \u201cnull\u201d;<br \/>\n        } else if (value instanceof String[]) {<br \/>\n            return convString((String[]) value);<br \/>\n        } else {<br \/>\n            return value.toString();<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     * Returns the contents of the string array [strArray] as a String like the one below.<br \/>\n     * \u201c[temp1,temp2,temp3]\u201d<br \/>\n     * @param strArray String array to be evaluated<br \/>\n     * @return String after conversion<br \/>\n     *\/<br \/>\n    private static String convString(String[] strArray) {<br \/>\n        if (strArray == null)<br \/>\n            return null;<br \/>\n        StringBuffer buff = new StringBuffer(\u201c[\u201c);<br \/>\n        for (int i = 0; i &lt; strArray.length; i++) {<br \/>\n            buff.append(strArray[i] + \u201c, \u201c);<br \/>\n        }<br \/>\n        buff.delete(buff.length() \u2013 2, buff.length());<br \/>\n        buff.append(\u201c]\u201d);<br \/>\n        return buff.toString();<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     * Convert [str] to Unicode.<br \/>\n     * @param str<br \/>\n     * @return<br \/>\n     *\/<br \/>\n    private static String convUnicode(String str) {<br \/>\n        if (str == null)<br \/>\n            return null;<br \/>\n        try {<br \/>\n            return new String(str.getBytes(\u201c8859_1\u201d), \u201cJISAutoDetect\u201d);<br \/>\n        } catch (UnsupportedEncodingException e) {<br \/>\n            throw new RuntimeException(e);<br \/>\n        }<br \/>\n    }<br \/>\n    \/\/ &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n    static class CustomFormatter extends Formatter {<br \/>\n        static final String pattern = \u201cyyyy\/MM\/dd HH:mm:ss\u201d;<br \/>\n        public synchronized String format(LogRecord record) {<br \/>\n            StringBuffer buf = new StringBuffer();<br \/>\n            \/\/ set date and time<br \/>\n            Date date = new Date();<br \/>\n            date.setTime(record.getMillis());<br \/>\n            SimpleDateFormat formatter = new SimpleDateFormat(pattern);<br \/>\n            buf.append(formatter.format(date));<br \/>\n            buf.append(\u201c:\u201d);<br \/>\n            \/\/ set level<br \/>\n            buf.append(\u201c[\u201d + record.getLevel().getName() + \u201c]\u201d);<br \/>\n            buf.append(\u201c:\u201d);<br \/>\n            buf.append(record.getMessage());<br \/>\n            buf.append(LINE_SEPA);<br \/>\n            return buf.toString();<br \/>\n        }<br \/>\n    }<br \/>\n    static class CustomConsoleHandler extends StreamHandler {<br \/>\n        public CustomConsoleHandler() {<br \/>\n            super();<br \/>\n            setOutputStream(System.out);<br \/>\n        }<br \/>\n        \/**<br \/>\n         * Issues a LogRecord.<br \/>\n         * Initially, logging requests are sent to a Logger object.<br \/>\n         * and this object initializes the LogRecord and<br \/>\n         *Redirected here.<br \/>\n         *<br \/>\n         * @param record Description of the log event. null records are simply ignored<br \/>\n         * and no notification will be sent.<br \/>\n         *\/<br \/>\n        public void publish(LogRecord record) {<br \/>\n            super.publish(record);<br \/>\n            flush();<br \/>\n        }<br \/>\n        \/**<br \/>\n         * Override StreamHandler.close to flush, but<br \/>\n         * Output stream is not closed. In other words, System.err is not closed.<br \/>\n         *\/<br \/>\n        public void close() {<br \/>\n            flush();<br \/>\n        }<br \/>\n    }<br \/>\n}<br \/>\n<\/textarea><\/p>","protected":false},"excerpt":{"rendered":"<p>Analyze HTTP requests with Java log filter Implement javax.servlet.Filter to analyze HTTP requests [\u2026]<\/p>","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"swell_btn_cv_data":""},"categories":[19],"tags":[],"_links":{"self":[{"href":"https:\/\/chat-messenger.com\/en\/wp-json\/wp\/v2\/posts\/910"}],"collection":[{"href":"https:\/\/chat-messenger.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/chat-messenger.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/chat-messenger.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/chat-messenger.com\/en\/wp-json\/wp\/v2\/comments?post=910"}],"version-history":[{"count":5,"href":"https:\/\/chat-messenger.com\/en\/wp-json\/wp\/v2\/posts\/910\/revisions"}],"predecessor-version":[{"id":1894,"href":"https:\/\/chat-messenger.com\/en\/wp-json\/wp\/v2\/posts\/910\/revisions\/1894"}],"wp:attachment":[{"href":"https:\/\/chat-messenger.com\/en\/wp-json\/wp\/v2\/media?parent=910"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/chat-messenger.com\/en\/wp-json\/wp\/v2\/categories?post=910"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/chat-messenger.com\/en\/wp-json\/wp\/v2\/tags?post=910"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}