——请先阅读这3篇文章:程序员
个人编码习惯 - 接口定义tomcat
个人编码习惯 - Controller规范服务器
开发中日志这个问题,每一个公司都强调,也制定了一大堆规范,但根据实际状况看,效果不是很明显,主要是这个东西很差测试和考核,没有日志功能同样跑啊。架构
但编程活久见,开发久了,总会遇到“这个问题生产环境上能重现,可是没有日志,业务很复杂,不知道哪一步出错了?” 这个时候,怎么办? 还能怎么办,发个版本,就是把全部地方加上日志,没有任何新功能,而后在让用户重现一遍,拿下日志来看,哦,原来是这个问题。app
有没有很熟悉的感受?微服务
还有一种状况,咱们系统有3*5=15个节点,出了问题找日志真是痛苦,一个一个机器翻,N分钟后终于找到了,找到了后发现好多类似日志,一个一个排查;日志有了,发现逻辑很复杂,不知道走到哪一个分支,只能根据逻辑分析,半天过去了,终于找到了缘由。。。一个问题定位就过去了2个小时,变动时间过去了一半。。。post
因此我对日志的最少有如下2点要求:性能
能找到那个机器
能找到用户作了什么
针对第一点,我修改了一下nginx的配置文件,让返回头里面返回是哪一个机器处理的。
nginx的基本配置,你们查阅一下资料就知道。简单配置以下(生产环境比这个完善)
效果如图,返回了处理的节点:
第二点,要知道用户作了什么。用户信息是很重要的一个信息,能帮助海量日志里面能快速找到目标日志。一开始要求开发人员打印的时候带上用户,可是发现这个落地不容易,开发人员打印日志都常常忘记,更加不用说日志上加上用户信息,我也不可能每天看代码。因此找了一下log4j的配置,果真log4j有个叫MDC(Mapped Diagnostic Context)的类(技术上使用了ThreadLocal实现,重点技术)。具体使用方法请自行查询。具体使用以下:
filter中获得用户信息,并放入MDC,记住filter后要清理掉(由于tomcat线程池线程重用的缘由)。
用户信息放入MDC:
log4j配置,增长用户信息变量:
我作好上面2步后,对开发人员的日志只有3点要求:
1. 修改(包括新增)操做必须打印日志
大部分问题都是修改致使的。数据修改必须有据可查。
2. 条件分支必须打印条件值,重要参数必须打印
尤为是分支条件的参数,打印后就不用分析和猜想走哪一个分支了,很重要!以下面代码里面的userType,必定要打印值,由于他决定了代码走哪一个分支。
3. 数据量大的时候须要打印数据量
先后打印日志和最后的数据量,主要用于分析性能,能从日志中知道查询了多少数据用了多久。这点是建议。本身视状况而决定是否打印,我通常建议打印。
加上一篇AOP,最后的日志以下:
其实日志的级别我到不是很关注,尚未到关注这步到时候。开发组长须要作好后勤工做(前面2步),而后制定简单规则,规则太多太能落实了。
日志这个东西,更可能是靠自觉,项目组这么多人,我也不可能一个一个给你们看代码,而后叫你加日志。我分析了一下,为何有些人没有打印日志的习惯,说了屡次都改不过来。我建议你们养成下面的习惯,这样你的日志就会改善多了!
1. 不要依赖debug,多依赖日志。
别人面对对象编程,你面对debug编程。有些人不管什么语言,最后都变成了面对debug编程。哈哈。这个习惯很是很是很差!debug会让你写代码的时候偷懒不打日志,并且很浪费时间。改掉这个恶习。
2. 代码开发测试完成以后不要急着提交,先跑一遍看看日志是否看得懂。
日志是给人看的,只要热爱编程的人才能成为合格程序员,不要匆匆忙忙写完功能测试ok就提交代码,日志也是功能的一部分。要有精益求精的工匠精神!
日志规范想不到写了这么多,不容易啊。以为有帮助请点赞加关注,其余规范敬请期待!更多内容请持续关注!