项目信息追踪(Log)

若是项目上过线的话,那你必定知道Log是多么重要。
  为何说Log重要呢?由于上线项目不容许你调试,你只能经过Log来分析问题。这时打一手好Log的重要性毫不亚于写一手好代码。项目出问题时,你要能拿出Log证实本身负责的部分没有问题,若是是本身的问题,要从Log里快速找出错误缘由。若是没有从Log里找出错误缘由,那必定是一件很悲催的事情,特别是在bug不容易重现的状况下。那简直就是叫每天不灵,叫地地不该啊。
  一.Log级别
  Log最经常使用的级别就是DEBUG,INFO,WARN,ERROR,其余的不多用。如何运用合适的Log级别也是很是重要的,在不应用ERROR的地方用了ERROR,可能会给你带来额外的麻烦。下边仅根据本身的使用习惯,分别说一下我对各类级别的理解。
  1.ERROR:
  ERROR是错误的意思,但不表明出现异常的地方就该打ERROR。我认为ERROR是相对程序正确运行来讲的,若是出现了ERROR那就表明出问题了,开发人员必需要查一下缘由,或许是程序问题,或许是环境问题,或许是理论上不应出错的地方出错了。总之,若是你以为某个地方出问题时须要解决,就打ERROR,若是不须要解决就不要打ERROR。
  举例来讲,若是有一个接口。调用者传过来的参数不在你的接受范围内,在这种状况下你不能打ERROR,由于传什么值是用户决定的,并不影响程序正确运行。想象一下,若是你的服务器上有监控程序的话,检测到ERROR或WARN就报警,参数错误你也打ERROR,那运维人员会疯掉的。
  若是作一个对讲机,在解析语音数据包时出错了,那就要打ERROR了,由于这个是理论上不应出错的地方,要不就是你的解析代码有问题,要不就是开发人员在拼凑语音包时存在问题,这个时候须要你来找出问题的缘由。因此应该打ERROR。
  2.WARN:
  WARN是指出现了不影响程序正确运行的问题,WARN也是问题但不影响程序正常运行,若是WARN出现的过于频繁或次数太多,那就表明你要检查一下程序或环境或依赖程序是否真的出问题了。
  假如你访问一个接口,设置了一个超时,超时以后会抛异常,你在try块里不应打ERROR也不应打INFO来无视它,这时你应该打WARN,牢牢是警告一下,若是超时过多那就该检查一下了,是否是对方接口有问题了或者是网络环境出问题了。
  3.INFO和DEBUG:
  ERROR和WARN是指有问题,而INFO和DEBUG就是指通常的信息了。在程序出问题时,若是这条log能够帮助你分析问题或查看程序的运行状况,那就应该打个INFO。若是仅仅是为了在调试阶段查看程序是否运行正确那就要打DEBUG。前边讨论的接口参数错误问题,就应该打个INFO了,调用者说你的接口老是返回错误代码,你能够告诉他,是他的哪一个参数传错了。
  二.如何打
  1.log必备信息
  在每一条log中都要将时间、类名及函数名,能够的话将行号也打印出来(不建议手写行号),像java的log4j就是不错的。
  2.函数开始结束处
  在重要函数的开始结束出应该打上log ,这样在看log时会比较直观,何时开始何时结束就会一目了然,万一中间出异常致使程序退出了,也知道是在哪一个函数忽然中断的。也一样适用于一个重要逻辑块的开始结束。
  3.返回结果
  尽可能在重要函数或web接口的每一个返回分支打印返回结果。在出现很差分析的异常时,从细节下手,这时log会派上用场。若是跟合做方在数据方面出现争议也能够及时拿出证据。
  4.添加Exception异常的捕获
  若是你在代码中捕获了某种异常,那你要在try块后添加Exception的捕获,以防出现运行时异常中断程序。
  5.务必打印堆栈信息
  在异常捕获代码中务必要将堆栈信息打印出来,不然打了那么多的log可能会功亏一篑。
  6.多线程的log
  在多线程的程序中,log最好要标记thredId,不然可能不知道是哪一个线程的做业,也没法有条理的来观察一个线程。
  7.成功失败标志
  若是某个函数是作一件比较关键的事情,那么这件事情成功仍是失败了,要打印log,不然关键事件运行结果如何都拿不出证据的话,实在是不能让人信服。
  8.先后log的关系
  若是是web程序或接口,那log就不是按照你预约的顺序出现的,多是好几个响应的log穿插在一块儿的。代码里若是有几条log先后存在必定的数据关系,那么要将这几条log的关联信息打出来,用来肯定是针对同一个响应的。若是没有明确的标志,很难说后边的log跟前边的log是同一个响应或者是针对同一条数据。
  9.关于耗时
  访问一个第三方接口、上传下载文件等可能耗时的操做,都要记录完成这个操做所耗的时间。不然程序性能出了问题,你不知道是网络缘由呢,仍是你调用的第三方接口性能出现问题呢,仍是你本身程序的问题呢。
  10.关于数量
  涉及到数量的操做要打印log,好比查询数据库和批量拷贝文件、上传下载、批量格式转换等批量操做,设计到的数量要打印出来。
  总之,打log的目的是为了迅速排错或在有争议时拿出证据证实本身。基于这个目的,log不在多,只要抓住一切对本身有利的信息,就能够了。
  想起其余的再继续补充吧,欢迎你们拍砖补充。
  本人学识尚浅,写文目的是为了获得你们指点。 假若文章帮到了您,那真是好极了。java

相关文章
相关标签/搜索