一定要记录日志!
日志很重要!不能用syso代替日志!一定要记录日志!
1.为什么要记录日志
在开发环境中,我们debug时可以使用syso。但是在实际的运行环境中,我们一旦部署了服务,基本上就没有机会去看命令行了。如果这时候出现问题怎么办?我怎么知道哪里出了问题?我怎么把问题记录下来?
所以详细的日志记录就显得很重要了。一旦出现问题,我们可以尝试通过日志去发现,并且解决。所以,一定要养成记录日志的习惯。把以前依赖syso的坏习惯改掉。
我以前一直用的spring等框架,整合log4j之后能自动进行日志输出。现在不允许使用srping了,导致所有地方的日志记录都要手写。可是我已经养成了不写日志的习惯了,现在感觉很不习惯。要好好改正这个毛病才行。
2.最好在哪里进行日志记录?
这里说一下日志记录的细节(使用log4j):
我个人认为,要在dao层中进行日志记录。因为涉及很多实际逻辑部分,在这里进行日志记录,过程会比较详细。
最好在获取参数,实际执行前,实际执行后各进行一次日志记录。如果没有参数,那就只在执行前后记录即可。
比如说,我要写一个方法,需要执行一次查询,使用sql为select * from user where username = ?。
这时候,我会先把传进方法的username参数记录下来,然后在执行sql前把这条sql记录下来,最后再执行sql后把返回结果也记录下来。
如果正常执行了,那么记录返回结果。如果执行错误了,也要记录报错信息。
(1)没有参数的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
public List<String> getDevi_seri_numList() { String sql = "select distinct devi_seri_num from tb_devi_info"; logger.debug(sql); PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { preparedStatement = connection.prepareStatement(sql); resultSet = preparedStatement.executeQuery(); List<String> list = new ArrayList<>(); while (resultSet.next()) { String devi_seri_num = resultSet.getString("devi_seri_num"); list.add(devi_seri_num); } logger.debug("getDevi_seri_numList:" + list); return list; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); logger.error("getDevi_seri_numList:", e); return null; } finally { DBConnManage.closeConnection(resultSet, preparedStatement); } } |
logger.debug(sql);记录了sql
logger.debug(“getDevi_seri_numList:” + list);记录了正确执行的结果
logger.error(“getDevi_seri_numList:”, e);记录了错误信息
(2)有参数的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
public ReturnPojo insertCust_info(insertCust_infoPojo insertCust_infoPojo) { if (insertCust_infoPojo == null) { return null; } logger.debug("insertCust_infoPojo:" + insertCust_infoPojo); ReturnPojo ReturnPojo = new ReturnPojo(); String cust_num = insertCust_infoPojo.getCust_num(); String cust_name = insertCust_infoPojo.getCust_name(); String cust_abbr = insertCust_infoPojo.getCust_abbr(); String cust_addr = insertCust_infoPojo.getCust_addr(); String cust_type = insertCust_infoPojo.getCust_type(); String remarks = insertCust_infoPojo.getRemarks(); if (cust_num == null || cust_num.trim().isEmpty()) { ReturnPojo.setRetCode(FailCode); ReturnPojo.setRetMsg("cust_num不可为空"); return ReturnPojo; } if (cust_name == null || cust_name.trim().isEmpty()) { ReturnPojo.setRetCode(FailCode); ReturnPojo.setRetMsg("cust_name不可为空"); return ReturnPojo; } if (cust_abbr == null || cust_abbr.trim().isEmpty()) { ReturnPojo.setRetCode(FailCode); ReturnPojo.setRetMsg("cust_abbr不可为空"); return ReturnPojo; } if (cust_addr == null || cust_addr.trim().isEmpty()) { ReturnPojo.setRetCode(FailCode); ReturnPojo.setRetMsg("cust_addr不可为空"); return ReturnPojo; } if (cust_type == null || cust_type.trim().isEmpty()) { ReturnPojo.setRetCode(FailCode); ReturnPojo.setRetMsg("cust_type不可为空"); return ReturnPojo; } if (!cust_type.equals("运营商") && !cust_type.equals("第三方")) { ReturnPojo.setRetCode(FailCode); ReturnPojo.setRetMsg("cust_type必须为运营商或第三方"); return ReturnPojo; } Cust_info cust_message = getCust_infoByCust_name(cust_name); if (cust_message != null) { ReturnPojo.setRetCode(FailCode); ReturnPojo.setRetMsg("当前用户名已存在,请更换用户名"); return ReturnPojo; } PreparedStatement preparedStatement = null; String sql = "insert into tb_cust_info (cust_num,cust_name,cust_abbr,cust_addr,cust_type,remarks) values (?,?,?,?,?,?)"; logger.debug(sql); try { preparedStatement = (PreparedStatement) connection.prepareStatement(sql); preparedStatement.setString(1, cust_num); preparedStatement.setString(2, cust_name); preparedStatement.setString(3, cust_abbr); preparedStatement.setString(4, cust_addr); preparedStatement.setString(5, cust_type); preparedStatement.setString(6, remarks); preparedStatement.execute(); ReturnPojo.setRetCode(SuccessCode); ReturnPojo.setRetMsg("插入成功"); logger.debug("insertCust_info:" + ReturnPojo); return ReturnPojo; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); logger.error("insertCust_info:", e); ReturnPojo.setRetCode(FailCode); ReturnPojo.setRetMsg("插入失败"); return ReturnPojo; } finally { DBConnManage.closeConnection(preparedStatement); } } |
logger.debug(“insertCust_infoPojo:” + insertCust_infoPojo);记录了参数
logger.debug(sql);记录了sql
logger.debug(“insertCust_info:” + ReturnPojo);记录了正确的执行结果
logger.error(“insertCust_info:”, e);记录了错误信息
3.特别注意
logger.error(“getDevi_seri_numList:” + e);和
logger.error(“getDevi_seri_numList:”, e);起到的效果完全是不同的哦!
上面的是void org.apache.log4j.Category.error(Object message)方法,下面的是void org.apache.log4j.Category.error(Object message, Throwable t)方法,明显就是两回事!
上面的那种方法,似乎只是把日志打印在控制台中而已,并没有记录到日志中。下面的那种方法才是实际记录了日志。(这点我没有求证,可能说错了,回头修改吧)
4.总结
记录日志非常重要,应该刻意去养成这种习惯。