如果项目上过线的话,那你一定知道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了,调用者说你的接口总是返回错误代码,你可以告诉他,是他的哪个参数传错了。

  二.如何记录LOG

  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不在多,只要抓住一切对自己有利的信息,就可以了。

  想起其他的再继续补充吧,欢迎大家拍砖补充。

转载于:https://www.cnblogs.com/ShaYeBlog/p/3553628.html

项目上线与LOG记录相关推荐

  1. 基于阿里云服务器环境搭建到项目上线系列文章之六——项目部署

    基于阿里云服务器环境搭建到项目上线系列 前言:最近购买了域名和一台阿里云服务器准备做点东西放上去,所以准备把环境搭建到项目上线的过程记录下来,计划一个系列6篇文章 基于阿里云服务器环境搭建到项目上线系 ...

  2. 基于阿里云服务器环境搭建到项目上线系列文章之三——安装git

    基于阿里云服务器环境搭建到项目上线系列 前言:最近购买了域名和一台阿里云服务器准备做点东西放上去,所以准备把环境搭建到项目上线的过程记录下来,计划一个系列6篇文章 基于阿里云服务器环境搭建到项目上线系 ...

  3. 基于阿里云服务器环境搭建到项目上线系列文章之四——安装composer

    基于阿里云服务器环境搭建到项目上线系列 前言:最近购买了域名和一台阿里云服务器准备做点东西放上去,所以准备把环境搭建到项目上线的过程记录下来,计划一个系列6篇文章 基于阿里云服务器环境搭建到项目上线系 ...

  4. 基于阿里云服务器环境搭建到项目上线系列文章之一——putty使用秘钥登录远程服务器

    基于阿里云服务器环境搭建到项目上线系列 前言:最近购买了域名和一台阿里云服务器准备做点东西放上去,所以准备把环境搭建到项目上线的过程记录下来,计划一个系列6篇文章 基于阿里云服务器环境搭建到项目上线系 ...

  5. luajit表记录监控(忆一次项目上线中遇到的luajit对象内存泄漏)

    1. 背景 我们项目为ARPG手游(也没啥见不得人的,就叫暗黑血统手游,后期不少坑钱活动的实现出自我手,轻拍...).我们的服务器底层设计源于某大厂,c/c++和luajit的实现,这次要说的是项目上 ...

  6. 前端项目上线相关配置

    1. 通过node创建web服务器 创建node项目,并安装express,通过express快速创建web服务器,将vue打包生成的dist文件夹,托管为静态资源即可,关键代码如下: const e ...

  7. 项目上线简化流程介绍

    最近上线因为高并发多线程定时任务引发了一次事故问题,当上线完成,且将事故处理完后回顾了下本次事故原因. 1.后半夜上线,人都比较困乏,极容易产生疏忽得情况. 2.上线业务较多,上线后测试点很多.与测试 ...

  8. 记一次php项目上线遇到的坑

    最近上线了一个项目的后台程序(基于ThinkPHP),期间遇到了不少坑,特此记录. 1,系统环境:CentOS Linux release 7.4.1708 (Core) 内核版本:3.10.0-69 ...

  9. 记一个自己项目上线的全过程

    个人终于第一次完成了一个java web项目从策划到最终上线的全过程,虽然项目十分简单,但全流程跑通的感觉还是倍爽的,之后再做项目则只是各个环节上的细化了. 现在我将我的"第一次" ...

最新文章

  1. Spring 4.2.2以上版本和swagger集成方案和踩过的坑
  2. 2-Qt6命令行控制台项目
  3. hdu 2874(LCA + 节点间距离)
  4. MySql 内连接,外连接查询方式区别
  5. 前端学习(1951)vue之电商管理系统电商系统之获取父级数据列表
  6. windows端口备忘
  7. adb过滤只查看某一个app的日志
  8. xml dtd 约束建立xml文档
  9. 极风云五里界IDC数据中心架构方案
  10. js 车牌号模糊处理
  11. 【转载】Oracle之同义词(SYNONYM)
  12. airflow实现Java定时任务,AirFlow定时调度执行Talend ETL任务
  13. 吴恩达老师深度学习课程完整笔记
  14. java实现单词默写助手,强烈建议new-hand收藏
  15. 信而泰OLT使用介绍-网络测试仪实操
  16. 2022 前端一场面试及答案整理
  17. 32位的ane与air sdk升级
  18. 孩子做作业用计算机,小学五年级写作业让用计算机吗
  19. STM32工作笔记007---认识OLED屏和LCD屏的区别
  20. android自动接听电话并回复,android自动接听电话各种异常处理

热门文章

  1. 使用OneFlow完成基于U型网络的ISBI细胞分割任务
  2. 【PAT (Advanced Level) Practice】1120 Friend Numbers (20 分)
  3. python【数据结构与算法】最长公共子串详解(附代码)
  4. 【Java Web前端开发】Response笔记
  5. python【力扣LeetCode算法题库】面试题 08.11- 硬币
  6. 公共基础选择题—关系代数和范式
  7. 脚本修改linux网络配置,用脚本实现Linux的网络配置
  8. uwsgi模式_nginx+uwsgi 和nginx+gunicorn区别、如何部署
  9. 网络推广网站解析为什么有些网站有收录却没流量?
  10. 移动端网站优化也不容小觑!