感觉打日志应该有通用的技巧,不知道各位大神对此有何见解?
比如在我看到的项目中,会考虑:
调用第三方接口时会打印日志:具体的Request和Response
调用组件时候打印具体日志,比如DB、MQ等
感觉打日志应该有通用的技巧,不知道各位大神对此有何见解?
比如在我看到的项目中,会考虑:
调用第三方接口时会打印日志:具体的Request和Response
调用组件时候打印具体日志,比如DB、MQ等
打印哪些log,楼上已经有很多回答了。还有两点建议:
1、对外部的调用封装
2、状态变化
3、重要方法的输入和输出
4、业务异常
5、非预期执行(比如删除一条数据,可能成功可能数据本省不存在)
6、很少出现的else情况
7、程序运行时间
8、大批量数据的执行进度
日志宜多不宜少,控制好日志级别就行。
说一下我的一个体会吧:
如果一个业务的处理流程会经过多个处理节点,那么在每个节点的出口和入口都要打印包含该条业务id的日志,业务处理出现异常时,grep一把这条业务的id,就可以定位是哪个节点处理出现异常。
嗯,楼上已经说的比较全面了。
补充一些
1.支付的时候,打log是很有必要的,因为直接涉及到收益,另外,提现一类操作也要打log。
2.对接其他接口的时候,如socket之类
3.对接一些第三方接口的时候,如极光推送等,要确认推送状态
等等吧
PHP在高并发的时候,如果日志不严格控制,仅仅log的打印就会消耗掉很多的请求时间、cpu,我们在严格测试代码之后都是每次请求进行一次日志存储,基本都会打印在/data/log或者是/mnt/log 前提是/mnt是挂载的 SSD盘性能相当快!日志一旦收集达到阈值我们就会将日志收集到 elk中,然后通过elk分析日志做出服务上的一些判断和改进
方法的入参处,必要参数(敏感信息加密),同时要把这个方法设计的flow流程的描述要加到前面.如果涉及到远程方法调用,traceId是会一直跟着所有日志输出
在调用其他方法的前后
涉及资金等核心操作的每一步
对于catch里面,可能会error输出一些错误描述,然后throw到最上面,统一打印exception信息
我是这样想的..一起讨论...看项目的架构设计打日志的系统..
打在客户端,打在服务端,还是打到分布式系统中..
对日志进行分类,方便快速定位.(可能会出现错误异常并且需要的分析的地方都可以打日志)
如果日志打得比较散,如何把这些日志收集起来.(本地日志,还是构建日志服务)
日志级别(参考这个:链接描述)
是不是要监控日志
至于究竟在哪个点打日志, 就是在基于业务需求上可能会出现异常并分析的地方;比如,支付系统不打日志不行吧?
其实个人认为日志的打印是一门学问的,打的位置关键不关键,输出的内容必要不必要
见过很多系统的日志,打的很多,看似很全.但是到出现问题的时候,排查错误很难靠日志快速定位.
我自己的习惯可能是:
自己的拙见,还请大家指点
8 回答4.6k 阅读✓ 已解决
3 回答2.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
3 回答4.1k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
3 回答3.1k 阅读✓ 已解决
这个问题我深有体会.原来项目有做过基于 winston 的 log 系统.
首先一定要明确日志的功能.
首先调试功能,这个需要结合业务逻辑.原则是能够利用 log 快速定位问题
常见的要点包括:
log 分情况
对于记录功能,在保证了调试的方便性上,尽可能保证数据的有效性及规范化
而分析功能是在系统能够长期稳定运行后,通过 log 的数据对系统进行优化
此外还可以利用 log 实现一些自动化功能,例如异常的推送等,关键指标的监控推送等