在同一个项目(乃至公司)中,日志级别的选取,应当遵循同样的规则。一般而言,会考虑以下因素:
常见的也有其它的因素,但是并不一但可取:
ERROR
。严格避免既不处理异常,然后打INFO或根本不打。日志级别的选择,发生在两个地方:
一般而言,记录日志的级别,以事情本身的性质决定级别。而日志输出的级别,会依据事情发生的环境和上下文来决定。比如,在应用级服务上,低层的内存缺页,网站IO异常,其本身的性质,决定了他至少是一个WARN。但是由于应用级所使用的库,已经处理好了IO异常,就并不需要把这些WARN输出出来。应当避免,因为不想输出出来,就去调整记录日志的级别的情况。
恰恰是因为日志的输出级别,常常需要结合上层服务的上下文,所以并不适合在公共的库中进行统一的控制。需要每个服务,结合自身的性质和环境,合理地设定日志输出的级别。
不同环境中的日志记录与输出级别应当保持一致。以保持不同环境之间行为的一致性。(本地环境可除外)
避免在代码上出现类似以下的行为——以环境决定日志记录的级别:
/** DON'T DO THIS **/
if (env == "prod") {
log.error("")
} else {
log.info("")
}
也要尽量避免形如以下的配置——以环境决定日志输出的级别:
logging:
level:
root: INFO
---
spring:
profiles: prod
logging:
level:
# DON'T DO THIS
root: WARN
使用空格分隔不同信息要素的纯文本,一般每条日志独占一行(考虑到异常信息和数据信息本身可能存在换行)。可读比较好,但是不便于后期的数据处理与分析。
日志格式的统一性,在微服务体系下非常重要。格式的不一致,会给后续的数据分析和处理带来困难。
使用Json格式化的日志可以承载更多信息。而且数据解析的质量更高。但是直接可读性,相比于纯文本略差。适用于有成熟的工具链的场景下。
日志输出的方式,会影响到日志采集的方式。需要根据系统架构选取合适的日志输出方式。
根据12-factors原则,在虚拟化的微服务构架体系下,建议将日志输出到标准输出,而非文件中[1]。
服务端日志应当包括以下信息:
其中日志消息体因为由软件工程师编写,建议遵循以下原则:
一般分支表达某种决策,关键决策的结果应当以输出到日志中。
所有的方法的出入口及代码过程中的return及break语句,如果涉及到事件做与不做的问题,应当记录成日志。
所有捕获的异常,如果没有做业务层面的处置,则必须输出成错误日志;如果有做处置,也应当作为关键信息记录。
logger
声明为私有静态成员。