任何系统都有可能会出现问题,出现问题时我们的第一反应是为什么会出错?出错时发生了什么?如何复现?
如果你记录了完善的日志,那么只要一看日志,你就能快速知道程序出现错误时究竟发生了什么,进而追溯到导致错误发生的原因,从而修复问题。
可以说一个日志记录是一个完善的系统必不可少的一部分。本文简单探讨为什么记录日志,怎么记录日志以及记录日志的方法。
应用层日志作用
总的来说,日志的根本作用是记录必要的程序执行过程和状态,以便于以后追溯和参考。
跟踪调试
在很多特殊环境下,不能使用单步调试等方法实时知道程序的执行情况,这时就需要使用日志来记录程序执行情况。
帮助开发人员或者测试人员知道程序的执行情况,进而修改程序和解决BUG等。
跟踪排查错误
当错误发生时,我们需要知道当时的程序执行情况,比如执行到那一步,执行时的个变量状态等。
我们需要通过对日志追踪,获取该错误发生时的具体执行环境,只有通过这些信息,我们才能分析出错误出现的原因,以及如何修正错误。
备案
另外,对于一些特别敏感信息的操作,比如设计金钱的操作,需要记录所有的流水日志,以供以后对账等参考。
而且这些日志也能够在系统出现问题时,恢复数据,降低经济损失
日志的分类
可以根据日志的用途对日志进行分类,也可以根据日志的必要性或者等级来进行分类,常用的分级方法如下:
TRACE
级:尽量详细的信息,以便于开发过程中观察,在开发完上线后应该被屏蔽,DEBUG
级:记录用于调试过程中的一些必要信息,在开发完上线后应该被屏蔽INFO
级:记录程序执行的关键步骤,在以后具有参考价值,在线上系统中有保留的价值WARN
级:属于轻微的“警告”,记录程序出现的异常情况,但是不影响正常使用ERROR
级:属于“普通的错误”,在程序可以控制的范围内,不会造成连锁影响或巨大影响FATAL
级:属于“致命错误”,可导致整个系统或者一系列功能无法使用,甚至导致系统瘫痪、关闭EMERG
级:属于“灾难”级,导致整个系统崩溃
其中TRACE
级和DEBUG
级的日志,只用于开发调试过程中,记录信息所在空间大,应该在开发完成后关闭。
在很多系统中可以不用这么细致的分类,但是一个完善的日志系统最起码包含三个以上基本基本的日志:
如可以只包含DEBUG
级,INFO
级,ERROR
级。
日志系统设计
在一个系统设计的前期,就应该规划好完善的日志记录方案,因为日志记录伴随在系统开发的没一个部分。
如果指靠在系统完成后在添加必要的日志记录是不现实的。
明确日志记录的目的
需要明确记录的日志是什么样的人使用:
开发人员需要使用的信息:
DEBUG
级等运维人员需要知道的信息:
ERROR
级等系统使用人员需要知道的信息:日志的输出和反馈等
系统审计人员需要知道的信息:关键业务
INFO
级日志
针对不同的使用人员,我们还应该规划合适的日志记录形式。
日志格式
随着系统的运行,日志肯定是不断增长的,为了以后能够快速找到需要的日志,需要注意一下几点:
善于日志分级,不滥用日志,不关键的日志应该在线上系统屏蔽
为不同的日志总类添加标签,以便快速查找相同类型日志
按照日期分级,一方面便于日志转存,另外也助于快速定位日志
日志应该有相对标准的格式,比如json,序列化等,以便于查找关键信息
总的来说,日志的记录一定是为了以后的追踪和读取,应充分考虑到以后获取日志的情形。
日志记录应注意的问题
性能损耗:日志记录不应过于频繁,应考虑到日志记录到来的系统性能损耗
安全性:不在日志中记录涉及安全的敏感信息,如在日志中记录用户密码是绝对禁止的
时效性:应该定期清理没有参考意义的日志,避免日志积累过多占用系统存储空间
日志的存储方式
常见的日志存储系统如下:
系统自带文件系统
分布式文件存储系统
Mysql数据库
Mongodb数据库
无论是哪一种存储方式,都要考虑到以后查询日志的遍历性,日志存储的性能损害,日志的用途等。
在一些需要对日志进行大数据分析的场景,还需要把日志转存到HDFS等专门的环境中。
实际应用
在不同的业务场景,需要记录的日志内容是千差万别的,但是它们的本质一定是为了之后的追溯使用。
在想Java,PHP等实际语言的开发中,可以为一个系统封装一个统一的入口Log日志记录类。
在这个Log类中规定统一的日志格式以及各种不同的日志记录级别,还可以在这个类中附加额外的信息等。
绝对避免在系统中随意记录日志。
原文更新至:< http://uusama.com/875.html>