日志用来记录用户操做、系统运行状态等,是一个系统的重要组成部分。然而,因为日志一般不属于系统的核心功能,因此经常不被团队成员所重视。对于一些简单的小程序,可能并不须要在如何记录日志的问题上花费太多精力。可是对于做为基础平台为不少产品提供服务的后端程序,就必需要考虑如何依靠良好的日志来保证系统可靠的运行了。小程序
好的日志能够帮助系统的开发和运维人员:
1. 了解线上系统的运行状态
2. 快速准肯定位线上问题
3. 发现系统瓶颈
4. 预警系统潜在风险
5. 挖掘产品最大价值后端
日志应该很少很多,可以从日志中获得全部须要的信息。在实践中常常发生日志不够的状况,例如:1)请求出错时不能经过日志直接来定位问题,而须要开发人员再临时增长日志并要求请求的发送者从新发送一样的请求才能定位问题;2)没法肯定服务中的后台任务是否按照指望执行;3)没法肯定服务的内存数据结构的状态;4)没法肯定服务的异常处理逻辑(如重试)是否正确执行;5)没法肯定服务启动时配置是否正确加载;
示例:
[INFO] RequestID:b1946ac92492d2347c6235b4d2611184, ErrorCode:1426, Message: callback request (to http://example.com/callback) failed due to socket timeout
缓存
[INFO] RequestID:b1946ac92492d2347c6235b4d2611184, auth request (to http://auth1.example.com/v2) timeout ... 1 try
[INFO] RequestID:b1946ac92492d2347c6235b4d2611184, auth request (to http://auth1.example.com/v2) timeout ... 2 try
[INFO] RequestID:b1946ac92492d2347c6235b4d2611184, auth request (to http://auth1.example.com/v2) success
要好于:[INFO] RequestID:b1946ac92492d2347c6235b4d2611184, auth request (to http://auth1.example.com/v2) success
由于前者可让咱们预判被依赖的服务器服务质量有风险,也许须要进行扩容;日志中须要记录关键参数,出错时的关键缘由等。服务器
[INFO] RequestID:b1946ac92492d2347c6235b4d2611184, auth failed
[INFO] RequestID:b1946ac92492d2347c6235b4d2611185, content digest does not match
[INFO] RequestID:b1946ac92492d2347c6235b4d2611186, request ip not in whitelist
就不如:
[INFO] RequestID:b1946ac92492d2347c6235b4d2611184, auth failed due to token expiration
[INFO] RequestID:b1946ac92492d2347c6235b4d2611185, content digest does not match, expect 7b3f050bfa060b86ba781151c563c953, actual f60645e7107917250a6408f2f302d048
[INFO] RequestID:b1946ac92492d2347c6235b4d2611186, request ip(=202.17.34.1)
一个系统一般经过RequestID来对请求进行惟一的标记,目的是能够经过RequestID将一个请求在系统中的执行过程串联起来。该RequestID一般会随着响应返回给调用者,若是调用出现问题,调用者也能够经过提供RequestID帮助服务提供者定位问题网络
RequestId的生成:数据结构