zoukankan      html  css  js  c++  java
  • Servlet过滤器——日志记录过滤器

    1.概述

        在实际的项目开发过程中,经常需要在项目运行时,记录并在控制台中输出运行时的日志信息,便于查看项目的运行状况。本实例将介绍如何应用过滤器实现日志记录。运行本实例,将在控制台中输出项目运行时的日志信息。

    2.技术要点

    本实例主要应用Apache的Log4j组件输出日志信息。该组件主要用于日志管理。Logger是Log4j的日志记录器,它是Log4j的核心组件。

    在程序中可以使用Logger类的不同方法来输出各种级别的日志信息,Log4j会根据配置的当前日志级别决定输出哪些日志。对应各种级别日志的输出方法如下:

    (1)DEBUE日志可以使用Logger类的debug()方法输出日志消息。

    语法如下:

    logger.debug(Object message)

    message:输出的日志消息,例如“logger.error("调试日志")”。

    (2)INFO日志可以使用Logger类的debug()方法输出日志消息。

    语法如下:

    logger.info(Object message)

    message:输出的日志消息,例如“logger.error("消息日志")”。

    (3)WARN日志可以使用Logger类的info()方法输出日志消息。

    语法如下:

    logger.warn(Object message)

    message:输出的日志消息,例如“logger.error("警告日志")”。

    (4)ERROR日志可以使用Logger类的warn()方法输出日志消息。

    语法如下:

    logger.error(Object message)

    message:输出的日志消息,例如“logger.error("数据库连接失败")”。

    (5)FATAL日志可以使用Logger类的fatal()方法输出日志消息。

    语法如下:

    logger.fatal(Object message)

    message:输出的日志消息,例如“logger.fatal("内存不足")”。

    3.具体实现

    (1)创建日志Filter实现类LogFilter.java主要是在初次调用时开始记录,执行时获取访问的URI和执行前的时间,关键代码如下:

    public class LogFilter implements Filter {
          private Log log = LogFactory.getLog(this.getClass());
          private String filterName;
          public void init(FilterConfig config) throws ServletException {
                filterName = config.getFilterName();//获取 Filter的 name,启动Filter
                log.info("启动 Filter: " + filterName);//
          }
          public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain)
                       throws IOException, ServletException {
                HttpServletRequest request = (HttpServletRequest) req;
                HttpServletResponse response = (HttpServletResponse) res;
                long startTime = System.currentTimeMillis();                                   //运行前的时间
                String requestURI = request.getRequestURI();                                   //获取访问的URI
                requestURI = request.getQueryString() == null ? requestURI                    //所有的地址栏参数对比
                            : (requestURI + "?" + request.getQueryString());
                chain.doFilter(request, response);
                long endTime = System.currentTimeMillis();
                //消耗的总时间
                log.info(request.getRemoteAddr() + " 访问了 " + requestURI + ", 总用时 "+ (endTime - startTime) + " 毫秒。");
          }
          public void destroy() { //销毁时记录日志
          }
    }

    (2)使用日志记录需要commons-logging的Log4j来输出日志,本例输出格式如下:

    og4j.rootLogger=INFO, A1
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%l]-[%p] %m%n
  • 相关阅读:
    UTF8编码的空格(194 160)问题
    经典sql语句大全
    Workflow 4.0 中三种方式实现workflow的触发调用
    VS2010 常用快捷键
    JS验证密码安全级别
    JS零散知识记录
    MVC project on VS2010 error : The project type is not supported by this installation
    解决IronPython没有三元运算符的问题
    何时何地不能使用泛型
    今天写的代码,可惜没有用上,但想想可能以后还能用上吧。
  • 原文地址:https://www.cnblogs.com/zkn11199/p/5600308.html
Copyright © 2011-2022 走看看