Exception时信息的记录

系统总有出现异常的时候,那么出现异常时应该如何处理?

一直以来,我都以为这么处理就足够的:

  • 在日志中打印Exception的堆栈信息,以便排查原因
  • 反馈给用户系统xxx出现问题

package com.nicchagil.util.requestlogger;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

public class RequestDemoServlet extends HttpServlet {

    private final Logger logger = Logger.getLogger(RequestDemoServlet.class);

    public RequestDemoServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        ResultSet rs = null;
        PreparedStatement pstmt = null;
        Connection conn = null;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection(
                    "jdbc:oracle:thin:@hostname:port:sid", "username",
                    "password");

            pstmt = conn.prepareStatement("select * from t_xxx t where t.id = ? ");

            pstmt.setString(1, "paramter");
            rs = pstmt.executeQuery();

            while (rs.next()) {
                System.out.println("‘" + rs.getString("result1") + "‘ - " + "‘" + rs.getString("result2") + "‘");
            }

        } catch (ClassNotFoundException e) {
            // Print exception logs
            logger.error("Failed to query xxx", e);

            // Prompt that system error
            response.getWriter().write("Failed to query xxx!");

        } catch (SQLException e) {
            // Print exception logs
            logger.error("Failed to query xxx", e);

            // Prompt that system error
            response.getWriter().write("Failed to query xxx!");

        } catch (Throwable t) {
            // Print exception logs
            logger.error("System error", t);

            // Prompt that system error
            response.getWriter().write("System error!");

        } finally {
            try {
                if (rs != null) {
                    rs.close();
                    rs = null;
                }
                if (pstmt != null) {
                    pstmt.close();
                    pstmt = null;
                }
                if (conn != null) {
                    conn.close();
                    conn = null;
                }
            } catch (SQLException e) {
                // Print exception logs
                logger.error("System error", e);

                // Prompt that system error
                response.getWriter().write("System error!");
            }
        }

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }

}

RequestDemoServlet

日前,得到一位资深同事Glen的指点,深知以上的操作是不足够的。

简单来说,我们需要记录,谁在什么时候做了什么事情

尽量详细地记录这些信息,让我们拥有更详细的信息用于排查问题(不知道请求参数的情况下,确实难以定位问题);在和其他团队作联合调试时,我们也可以提供足够的信息,不致陷于尴尬、被动地位。

  • 当前登录用户的ID或代号(在系统需要登录并用户已登录的前提下)
  • 当前请求的URL
  • 当前的请求参数

一般情况下,Web Project是在Servlet(或使用框架时所称的Action、Controller、Ctrl)处理Exception的。

除了“当前的请求参数”外,其他的都较好处理。因为每个请求的参数不尽一致,在每个Servlet都hardcode来打印各个参数,这是一个累人的活。

这里,分享一个静态方法用于打印HttpServletRequest的全部请求参数,这样就不致于每次都hardcode打印请求参数了。

package com.nicchagil.util.requestlogger;

import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

public class RequestLogger {

    /**
     * toString for HttpServletRequest Parameters
     * @param request
     * @return
     */
    public static String toString(HttpServletRequest request) {

        Map map = request.getParameterMap();

        /* Since there are String[] in the map, can not return map.toString() directly. */

        if (map == null || map.isEmpty()) {
            return "";
        }

        StringBuffer sb = new StringBuffer();
        Object key = null;
        String[] value = null;
        Iterator iterator = map.keySet().iterator();

        while (iterator.hasNext()) {
            key = iterator.next();
            value = (String[])map.get(key);

            sb.append(key.toString()).append(" : ").append(toString(value, true));
            sb.append("\n");
        }

        return sb.toString();
    }

    /**
     * toString for String Array
     * @param stringArray
     * @return
     */
    public static String toString(String[] stringArray, boolean alwaysArray) {

        if (stringArray == null || stringArray.length == 0) {
            return "";
        }

        if (!alwaysArray) {
            if (stringArray.length == 1) {
                return stringArray[0];
            }
        }

        StringBuffer sb = new StringBuffer();
        sb.append("[");

        for (int i = 0; i < stringArray.length; i++) {
            sb.append(stringArray[i]);

            if (i < stringArray.length - 1) {
                sb.append(", ");
            }
        }

        sb.append("]");

        return sb.toString();
    }

}

RequestLogger

Exception时信息的记录,布布扣,bubuko.com

时间: 2024-08-04 00:03:09

Exception时信息的记录的相关文章

java的异常(Exception)信息的详细记录

java的异常(Exception)信息的详细记录获取Exception的详细信息下面的三个方法都是获取异常的详细信息,或许的异常详细信息以字符串的形式返回,保持栈堆的风格 方法一: public static String getExceptionAllinformation(Exception ex){         String sOut = "";         StackTraceElement[] trace = ex.getStackTrace();         

u-boot从nand 启动时的问题解决记录

u-boot从nand 启动时的问题解决记录 问题描述: 使用u-boot-1.1.6版本u-boot移植到JZ2440开发板上,当前已经能够从Nor启动,但是不能从Nand正常启动(u-boot大小为95.8k,已经超过的2440从Nand启动时所能拷贝的4k大小),当前代码中只具备从Nor启动时,重定位代码到SDRam的功能,所以需要添加从Nand启动时将u-boot代码重定位到SDRam中,之后跳到SDRam中运行: 针对上述需求中Nand操作部分增加代码如下: /* s3c2440中na

Centos6安装FreeSWITCH 1.5时./configure问题解决记录

系统:Centos 6.4 64位: FreeSWITCH版本:1.5 具体的安装过程参考FreeSWITCH 官网wiki (也可以参考我的博客<Centos6安装FreeSWITCH>) 从FreeSWITCH 安装过程./configure 时遇到sqlite 的问题开始: checking for sqlite3 >= 3.6.20… Package sqlite3 was not found in the pkg-config search path. Perhaps you

Python中获取异常(Exception)信息

异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序结构.如下所示 try: ... except Exception as e: ... 1.str(e) 返回字符串类型,只给出异常信息,不包括异常信息的类型,如1/0的异常信息 'integer division or modulo by zero' 2.repr(e) 给出较全的异常信息,包括异

Python中获取异常(try Exception)信息

异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置. 这里获取异常(Exception)信息采用try...except...程序结构.如下所示: try: ... except Exception, e: ...经典例子: import traceback print '########################################################' print "1/0 Exception Info" print '---

关于在学习python爬虫时的学习记录

最近学习python3爬虫,看的是这位博主的博客,不得不说,是真的厉害,通俗易懂^?_?^ 我要学习的还有很多-从基本的python知识,我就被难倒了- 哎,记录下我的盲点- 花了近一个钟头测试出来的结果. 在爬取相关的html时,text ≠ text[0] 后者是正确的.我一直以为不加的效果也是一样的结果,在我理解看来就是从头开始的,即从0到尾的所有相关的内容,实际上我的理解与相关的python基础不谋而和,可能是爬虫就需要如此的?我就默认好了- 在python中的方法后面的()是不可省去的

通过拦截器Interceptor实现Spring MVC中Controller接口访问信息的记录

java web工程项目使用了Spring+Spring MVC+Hibernate的结构,在Controller中的方法都是用于处理前端的访问信息,Controller通过调用Service进行业务处理后给前端返回ModelAndView对象或者只返回Json格式数据.如果能够获得Http请求在后端程序中处理的相关信息,对于开发和调试时十分方便的.工程中使用了Spring MVC的Interceptor对所有Http请求及其响应进行拦截,从而获取到本次访问接口信息以及程序处理时长等信息,特意在

自己初学时的随笔记录

如果富文本编辑器 jsp....文件可以找到但是就是显示不出来,可能是Controller控制器中@RequestMapping后边没有写路径 ---------------------------------------------------------------------------------------------------------------------------- iframe框架内的页面如果要想不覆盖或者成为一个有机整体,需要在<a></a>连接到的js

记,基于Android开发类似于微博的东东时,值得记录的几个问题~

作为一个Java的使用者,在经历了Web到服务端开发的工作后,今年终于开始接触一些android开发方面的工作了. 新的挑战~~最近有一个需求是在应用里开发一个类似于微博的功能模块,说难不难,说易不易~~ 作为一名Android上的菜鸟,在开发的过程里还是遇到不少问题的.当然,紧接着的就是一个个的想办法解决问题~~~~~ 一直想把过程中遇到的,自己觉得几个比较有意义的问题,及其解决方法记录下来,但苦逼的是最近一直没有多的时间~~~ 今天又到了一周一度的美好周末,阳光明媚,那干脆起个早,来写一写,