日志分类经验详谈 郝伟 2021/10/01 [TOC]
1. 1 简介
在应用程序中,有大量关于日志的分类方法,经过大量实践摸索,推荐Log4j的分类方法(参考 干货:日志打印的8种级别).
2. 2 分类定义
根据log4j的分类,有以下几类及相应关系:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
从字面上来说,很容易理解,ALL是所有,然后级别由低向高依次向为至OFF为关闭。
3. 3 分类详解
3.1. TRACE
字面意思是用于追踪,其核心作用是用于程序运行时的状态追踪,主要是各类变量的值。在程序运行过程中,变量的值会不断发生变化,所以为了监督这些值,在代码中的不同位置可以使用日志进行输出。举例来说,程序中有一个列表变量叫 onlineUserList,那么每过一段时间,可以将其长度记录到日志中,如 2021/10/01 15:24:35 TRACE #Process1 onlineUserList=153
这样的信息只是为了追踪其状态而记录的,可能在某些时候或某种目的下会有用,但即不是错误信息,也不是调试信息。
总结:TRACE类的日志,简单地说就是用于记录状态在代码某处的某时刻的运行中的状态变量的值。
3.2. DEBUG
用于验证值的正确性,如格式是否正确,连接是否成功等。 这里是用于调试为主要目的,输出的值除了可以是象TRACE一样有状态值,但更多的目的是为了验证是否正确。比如,连接字符串是否可以正常连接,文件是否可以打开,格式是否正确等。
总结:DEBUG类的日志通用会输出一个结果,表明对某种功能的验证能否通过,以达到调试程序的目的。
3.3. INFO
一般的日志信息,常用于记录执行的结果,如一些业务执行情况的信息,文件输出,用户登陆记录等。这些信息通常是程序的功能层面的,不涉及代码功能,读者即可以是开发人员,也可以是系统的使用人员。
总结:记录一些常规的系统正常发生的业务事件。
3.4. WARNNING
WARNNING通常用于记录潜在的可能导致出错的风险状况,如执行时间过长,文件体积过大等。所以,WARNNING发生的信息并不是错误,而是一些不正常的情况。比如在文件传输时,如果延时过大,或者传输时间过长,虽然仍然也完成了,但是可能会存在一定的错误隐患,所以需要提醒。
总结:记录一些错误风险或隐患信息。
3.5. ERROR
错误事件,一般指程序中发生一些功能上的问题但不影响软件正常运行的错误,如打开文件失败,找不到文件,格式不匹配,转换出错等。 这些错误往往意味着,正常的业务功能没有完成,除了日志中会记录,通常在界面上也会弹出警告对话框进行警示。
3.6. FATAL
非常严重错误,不仅业务功能无法完成,而且已经导致整个应用无法正常执行或直接终止执行的错误事件,如内存溢出、异常无法处理等原因导致的程序退出。
总结:系统级的导致程序崩溃的重大错误。
3.7. ALL 和 OFF
最后还有两类实际上并不是错误等级,而是日志输出等级。ALL所有日志全部输出,OFF全部不输出。参见下一章。
4. 4 分类比较
日志记录简单分为以下几种情况: 1、一般信息的记录 对于业务运行中的一些信息,使用INFO和WARNNING来记录。其中INFO只是一般业务的结果记录,而WARNNING则是对一些可能有问题的信息进行提醒。两者在功能上都是正确的,即都不是错误。同样地,在小项目中的简化使用可以只用其中的一类。
2、程序报错 ERROR和FATAL都是不同级别的程序错误,这些错误会导致业务执行失败,是在程序正常运行时,由程序自己通用一定的机制,如使用if或try-catch发现的导致业务没有正常执行的问题进行记录。这两类问题是用户直接可以在界面上或输出的结果上看到的错误,且多是属于程序级用户无法修改。部分可以通过用户配置完成(如连接字符串配置错误),经常需要用户管理员和开发人员一起解决。
3、程序内部出现问题 一般是在程序出现ERROR、FATAL错误,或者用户发现的一些功能上没有达到预期的情况。此时,由于是在运行环境中,无法直接通过设置判断的方式进行判断,就需要通过使用TRACE和DEBUG记录中间的信息,实现程序的调试。TRACE和DEBUG实际上并没有本质的区别,都是为了验证程序的内容而输出。一般而言,对于状态变化或信息量比较大的内容,使用TRACE进行记录。对正确性的验证使用DEBUG。当然,对于大部分比较“懒”的程序员而言,只使用一个不进行区分是完全可以的,而且如果不是特别大的项目,不进行区分实际上也没有什么影响。
5. 5 关于输出等级
在日志记录时,通用的方法的在系统配置文件中,使用一个参数表示日志输出等级。比如,参考这个顺序:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
,那么设置为 ALL 时,全部日志都会输出,设置为 INFO 时,不会输出 TRACE和DEBUG。这样即可通用设置来控制所需要的输出日志的内容。
一般来说,级别越低,信息量越大,其顺序与上面是相反的,即 TRACE > DEBUG > INFO > WARN > ERROR > FATAL
。这很好理解,TRACE是最多的,无论是否出错,只要达到设置的输出状态要求,就会输出,当状态和条件比较多时,会大非常大量的输出。而DEBUG的输出,只有在调试时才会输出。到ERROR等则出现的几率更低。由于这些输出都是耗时的,所以为了保证程序的运行效率,通用输出会设置到INFO级,这样TRACE和DEBUG就不会输出。而在程序出现问题时,再修改配置为TRACE或DEBUG进行记录观察,以达到调试的目的。