题记:日志记录,对一个应用非常重要,不仅仅只为定位线上bug(exception日志),还有业务日志,比如:统计用户的搜索词、响应时间等。
一、日志级别
众所周知,在log4j中定义5个最常用日志级别:debug、info、warn、error、fatal,级别依次严重。
可大家思考过,什么时候应该记info,exception时是应该记warn,还是error呢 ?下面是今天小团队讨论后,自己的一些理解。
debug:程序内部的信息,对于外部使用的人是没有意义。比如:函数的执行时间。(fine-grained information events that are most useful to debug an application)debug记录的是细粒度的事件信息,对于调式程序是非常有用的。
info:informational messages that highlight the progress of the application at coarse-grained level.(强调应用的执行的进度,关键分支的记录)。比如:关键分支记录(输入参数等),
对运维工程师来说这些信息也是有价值的,info指明程序的运行是否符合正确的业务逻辑。
对于warn与error级别,是我自己最困惑的 ?
先讲个形象的例子 :
有一天,李三说请你帮个忙,帮他收拾一下自行车,但是他的自行车是放在他自己家里的,房屋上锁。
1、李三:给你钥匙,此时你没有工具,但是你可以用你自家的工具修理自行车。结果:完成任务;过程:存在问题,内部可以处理此问题。
2、李三:没给你钥匙,但给你工具或者没给你工具,此时你不能接触到自行车。结果:无法完成任务;过程:存在问题,无法处理此问题。
结论:1情况,记warn;2情况,记error。观点:关注的是最小单元的业务是否能够完成,而对于应用来说,最小单元的业务就是“method方法”,每个方法去完成的任务都是一个独立的、最小单元的业务。
提醒:必须结合具体场景来判断,比如:dao从数据库获取数据失败,对自身来说是error,没有完成获取数据的任务;但对业务层来说,或者有其它方法修复此异常,如通过http重新获取等,此时业务层是完成自身任务的,所以为warn。
warn:potentially harmful situations.(潜在的有害状态)。比如:广告投放,淘宝搜索右侧p4p广告会根据地域展现,但某次用户搜素,ip地址获取失败,可能会用默认值替代或者为空,但是并不影响右侧广告的展现。所以展现广告的任务是完成的,对于业务来说是执行成功的,尽管过程中出现问题。
error:error events that might still allow the application to continue running.(错误事件发生,程序或许依然能够运行)。比如:广告前段展现,通过http从引擎获取数据时,因为引擎的机器连接数达到上限或者临时网络原因,timeout,但程序能正常运行,next请求引擎则成功。从函数角度看,此函数任务没有完成,记error。
fatal:very severe error events that will presumably lead the application to abort.(错误可能会导致应用崩溃)。
对于日志级别,或许大家也会有自己的理解(如有不同意见,请大家指点)
二、记录信息
这个话题简单一点,三点:
1、做什么操作
2、输入内容
3、堆栈信息(有堆栈信息的情况下)