1.作用和意义
日志在应用开发中必不可少,日志有记录用户操作、定位应用程序的故障根源,进一步来分析用户的行为、应用的性能、执行效果等作用。
2.不同类型的日志
主要分为系统致命错误日志,系统可控错误日志,用户操作日志和程序运行日志。
-
致命性错误日志:用于记录会影响整个系统正常运行的错误,比如我们在开发过程中的try…catch…模块中抛出的一些未能预料到的系统错误,而且这种错误会导致系统运行失败的信息进行记录
-
系统可控错误日志:这一类的日志发生之后其实不会导致系统运行出现异常的,可能是对某些数据的初始化深入验证出现的问题
-
用户操作日志:这一类日志量比较大,同时这一类日志用于跟踪用户的行为分析是非常的重要的应为可以作为用户数据挖掘发现用户的喜好等一些信息
-
程序运行日志:这一类信息用于记录程序运行的情况。
3.java日志工具
记录日志的开发工具很多,如:java.util.logging、SLF4J、Apache Conmmons Logging、Log4j等,这里不再介绍这些工具。
日志的记录级别也有分:一般情况下,使用得比较多的级别是 FATAL、ERROR、WARN、INFO、DEBUG 和 TRACE 等。这 6 个级别所对应的情况也有所不同:
FATAL:导致程序提前结束的严重错误
ERROR:运行时异常以及预期之外的错误
WARN:预期之外的运行时状况,不一定是错误的情况
INFO:运行时产生的事件
DEBUG:与程序运行时的流程相关的详细信息
TRACE:更加具体的详细信息
4.java日志编码规范
- 4.1.提交前去除编码帮助日志
一旦你已经完成开发工作,在将代码提交到使用中的 SCM 系统(git、svn……)之前,要去除所有临时的和不必要的日志消息,如:alert、System.out、assert等无用的消息。
- 4.2 匹配日志等级
致命错误日志的记录使用fatal级别
系统可控错误日志的记录使用error级别
用户操作日志的记录使用debug/info级别
系统运行日志的记录使用trace级别
如果不希望输出错误的日志,那么也可以参考以下方式(以执行环境区分):
成品阶段: 我的代码是 INFO 等级,第三方库是 WARN
测试、集成阶段:我的代码是 DEBUG 等级,第三方库是 WARN
开发阶段:任何有意义的信息
- 4.3 优化日志的信息
当记录的日志量足够多的时候,如果记录的内容格式不一,杂乱无比,那么对读者来说是很难阅读的和分析的,所以记录的日志最好遵循一定的格式和包含充分的信息:
-
发生时间
-
出现问题的线程
-
日志级别
-
出现问题的类文件,类的哪一行,异常栈
-
程序入参
-
相应的程序员的注释等
-
尽量输出一些「不可变的或者唯一」的信息来表示这条日志信息的唯一
- 4.4 log DEBUG消息之前检查日志等级
这种做法可以阻止代码去创建日志消息和调用 logger,提高产品运行程序的效率:
if ( logger.isDebugEnabled((){
logger.debug (…….)
}
- 4.5 了解使用的 logger工具
如果使用SLF4J,记录日志的正确用法应该是:
logger.info(“Person name is {}“, person.getName());
这里的格式化字符串是常量,不可变消息只有在允许 logging 的情况下才会被创建。
- 4.6 类中关于Logger等工具的使用
在一个类中通常只使用一个Logger对象且Logger应该是Static和final的,只有在少数需要在构造函数中传递logger的情况下才使用private final。
- 4.7 注意点
-
根据系统使用场景不同,对日志的侧重点就不一样。比如我们做两个系统,一个是「权限管理系统」,另外一个是「信息通知系统」,干一些发邮件,短信等的消息。前者我们需要详细的操作日志,记录「谁在某年某月某日为某人分配了什么权限」,因为审计部门需要。而后者即便发送出错了,重试或者忽略都可以考虑,甚至都不需要记录任何的日志
-
重要API、系统间交互等地方需要添加日志,因为都是监控的重点位置
5.谨记
记录日志只是有效地利用日志的第一步,更重要的是如何对程序运行时产生的日志进行处理和分析,但遵循好的java日志编码规范,就能给分析带来更大的便捷和帮助。
参考自:Java日志记录的5条规则