日志介绍
# 日志介绍
不管是什么编程语言,都需要用到日志。
# 什么是日志
日志,和日记类似,都是记录东西的。现实生活中,很多行业都有用到日志:
- 在航海🚢中,有航海日志,“航海日志是船舶日常工作的记录,检查船员值班责任的依据,也是处理海事时所必须引用、且能在法律上起作用的原始资料。-百度百科”
- 在飞行领域✈,有黑匣子,万一发生了空难,可以通过黑匣子分析为何发生了空难,发生的前因后果。“现代商用飞机一般安装两个黑匣子,分别是“驾驶舱语音记录器”和“飞行数据记录器”,用于航空器事故的调查、维修和飞行试验- 百度百科”
- 即使是个人🧑,也可以写日志,作为对自己的生活的记录和总结等,便于回顾
- ....................
通过日志,可以很方便的回溯发生过的事情,方便未来定位问题和总结。
# 日志的作用
在程序员的工作中,日志是非常重要的。可以说,如果系统遇到了什么问题,大部分都得靠日志去定位和解决
程序运行起来以后, 基本上就是一个黑盒子,如果程序的行为和预料的不一致,那就是出现Bug了,如何去定位这个Bug 呢?
如果没有记录日志,那么对于已经发生过的事情,我们是无法得知其内部是如何变化的,例如变量的变化情况,数据库的执行情况等等;这时候如果根据问题发生从场景,来复现这个问题的话,还不一定能复现出来,因为我们不能准确的定位到为什么发生了这个问题。
有时候是用户操作失败了,但用户记错了,那么要复现问题就难上加难了……
所以,没有记录日志的话,遇到难排查的问题,基本就炸了 💥,特别是遇到一些紧急和重大的问题的时候
笔者曾负责一个电商系统,在该系统内,几乎用户的任何关键的操作,都会记录在日志里。这样,当客户反馈有什么问题的时候,就可以通过日志去定位用户操作到哪一步了,后台有什么错误输出,以此来复现和解决
这里也引用看到的一个总结:
在我们开发一些业务比较复杂的程序时,开发者们往往在重要时刻记录一些日志,这些日志在排查问题的时候,跟踪调用流程时特别有用。因为一旦程序出现问题,如果没有日志,又不能让用户去复现问题的话,我们往往需要大量时间去一步步排查和跟踪,如果有业务日志,就可以根据日志整理出一个业务处理链条,顺着这个业务链条就可以就可以得到程序处理的过程,定位并复现问题。 --《Electron实战》第188页,刘晓伦著
日志的意义与价值,,用一些专业术语来说就是:
- 在开发调试阶段:日志系统有助于更快的定位问题。
- 在应用运维阶段:日志系统有助于记录大部分的异常信息,通过收集日志信息可以对系统的运行状态进行实时监控预警。
- 在数据分析阶段:日志中通常包含大量的用户数据,包括点击行为、兴趣偏好等,基于这些数据可以对用户进行“画像”,进而助力战略决策。随着大数据技术日渐成熟,海量日志分析已经在互联网公司得到广泛应用。
# 一个日志文件会记录什么
一个日志,笔者根据经验认为,应该记录如下内容:
- 用户的操作记录:当用户遇到问题的时候,除了通过用户提供的描述来分析问题,也应该通过日志排查是否用户哪一步搞错了,因为有时候用户自己也会记错;或者项目在运行到哪一步的时候发生了错误,方便定位到具体的代码
- 和其他系统的交互记录。例如要和第三方系统进行交互(比如支付宝、微信支付等),如果是对方系统的问题,我们也有相应的佐证和记录
- 错误信息。当程序遇到错误的时候,应该打印错误信息,不管是程序的异常,还是数据库的异常,例如执行什么方法报错了,或者执行什么SQL报错了,都有助于分析和解决问题
这里提一下,一个日志文件一般以 .log
结尾
# 日志的级别
并不是所有事情都要打日志,确切的说,不是什么时候都应该打印全部日志。
例如,在系统刚上线的时候,尽可能的多打日志是对的,不管是错误的日志,还是正确的日志,甚至可能一些不太重要的日志;因为有一些问题可能没有暴露出来,当有问题的时候能很好的通过日志 定位和解决问题。
当系统运行稳定的时候,再打印这么多日志就没有必要了;大部分功能都已经稳定,还继续打印那些正常的日志,着实没有必要,因为此时大部分功能都不会有问题了,此时可以将系统设置为 只打印错误日志
也就是说,日志是可以分级别的。例如可以定个3级,1级表示全部打印日志,2级表示打印关键日志,3级表示只打印错误日志,不同阶段需要不同的日志级别;
日志分级别,也是很合理的,不可能所有日志都一样重要。
举个生活中的例子,我们写日记的时候,可以先记录一些非常重要的事情;一些无关紧要的事情可以稍后在记录,或者不记录;当我们回顾的时候,优先看重要的日志
# 日志管理
由于日志是如此重要,在一些大型的企业中,会对日志有专门的管理办法。这里说下笔者接触过的企业吧:
制定专门的日志管理制度,各系统原则上均要满足该制度的内容
日志文件应该有多个。如果不切分日志,那有些系统的日志很容易就达到几十G,对于压缩、查看和移动都很占用时间
有的系统是 1天1个日志文件 或 1小时1个, 也有的按大小切分,当超过100M就自动生成一个新的日志 或者结合起来,一小时一个,当超过100M时则生成第二个日志文件,例如以.2结尾
日志保存期限:一般在线的会保存一年,超过一年后的话可以考虑磁带等存储方式或直接清理。
日志的压缩:为了不让整体日志占用太多的空间,一般会压缩3天前的日志;
日志中通常含有敏感信息,得保护好日志不能被随意访问。例如用户的姓名,手机号,邮箱等,而且会体现代码的执行过程,如果被随意泄漏,会造成客户的损失,并且有可能被黑客抓到漏洞,进而攻击系统。
对于日志保存期限和大小,可以用crontab脚本压缩和清理一年前的日志。
上述日志管理的方法仅供参考,读者应结合自己的实际情况,来选择日志管理方法。也有的项目会将一些关键的日志记录到数据库里(这样就不用打开日志文件去搜索),方便搜索数据库。
# 日志的缺点
那是不是使用日志就没有缺点了呢?有的 :
- 需要增加打印日志的代码,在开发阶段增加了一点工作量
- 项目在运行的时候,会执行打印日志的代码,会占用一定的资源(CPU和内存),降低一点点项目的性能
- 当日志太过详细,日志文件会太大;会占用一定的存储空间;并且太多的话在排查的时候难以定位(例如一个1G的日志,打开会很慢,搜索也会很慢)
当然,大部分时候记录日志都是利大于弊的
# 相关阅读
例如B站崩溃的时候,也是要看日志:
文字版:2021.07.13 B站是这样崩的 (opens new window)
视频版:2021.07.13 B站是这样崩的_哔哩哔哩_bilibili (opens new window)
22:55远程在家的相关同学登陆VPN后,无法登陆内网鉴权系统(B站内部系统有统一鉴权,需要先获取登录态后才可登陆其他内部系统),导致无法打开内部系统,**无法及时查看监控、**日志来定位问题。
欢迎补充其他的相关阅读~