Java中的日志
# Java中的日志
# 关于日志的故事
一个关于log4j的发展历史小故事 (opens new window)
# 日志组成介绍
Java中的日志框架主要分为两大类:日志门面
和日志实现
日志门面:日志门面定义了一组日志的接口规范,它并不提供底层具体的实现逻辑。Apache Commons Logging 和Slf4j(Simple Logging Facade for Java)就属于这一类。
日志实现:日志实现则是日志具体的实现,包括日志级别控制、日志打印格式、日志输出级别(输出到数据库、输出到文件、输出到控制台等)。Log4j,Log4j2、Logback以及Java Util Logging则属于这一类。
# 日志的选择
在实际使用中,我们会选择一个抽象层的日志门面搭配一个底层日志实现
来使用的。下图是slf4j官网中关于日志实现的适配图,其中深蓝色的是具体的实现,蓝绿色的是适配层,是介于门面跟实现之间的适配jar,为了解决有些门面跟实现的兼容问题的。
而灰色的则是替换包,为了跟其他框架中自带的日志框架进行合并而存在的(让系统重中的所有日志系统都统一到slf4j
)。
1.将系统中其他的日志框架先排除
2.用中间包来替换原有日志框架中的包(既支持原有框架中的使用,又支持转成slf4j)
3.导入slf4j其他的实现
- 官方网站: https://www.slf4j.org/
- 适配器使用: http://www.slf4j.org/manual.html
- 桥接器的使用: http://www.slf4j.org/legacy.html
# springboot中的日志
SpringBoot中默认选择的搭配是:
slf4j+logback
,并用INFO级别输出到控制台。在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了。
默认情况下,Spring Boot将日志输出到控制台,不会写到日志文件。如果要编写除控制台输出之外的日志文件,则需在application.properties中设置logging.file或logging.path属性。
# Logback的组成
logback主要有三个重要的组件
- Logger(记录器) 日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。
- Appender(输出源) 用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。
- Layout(布局) 负责把事件转换成字符串,格式化的日志信息的输出。在logback中Layout对象被封装在encoder中。
# Logger
Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用来指定这条日志信息的重要程度
日志级别的输出有个规则:只输出级别不低于设定级别的日志信息
,假设Loggers级别设定为INFO,则INFO、WARN、ERROR和FATAL级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。
fatal 指出每个严重的错误事件将会导致应用程序的退出
error 指出虽然发生错误事件,但仍然不影响系统的继续运行
warm 表明会出现潜在的错误情形
info 一般和在粗粒度级别上,强调应用程序的运行全程
debug 一般用于细粒度级别上,对调试应用程序非常有帮助
# Appender
Appender翻译过来就是附加器,它是附加在Logger对象上的。我们说的更直白一些,它就是指明日志输出到哪里的一个配置项,logback支持将日志输出到多种目标中,例如:控制台、文件、远程socket服务器,数据库、jmx等。当你配置了一个Appender,并将其附加到某个Logger对象时,就代表这个logger打印的日志会输出到Appender指定的目标中。
# Layout
Layout提供四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式
# 使用
# 配置文件
# 例子
待补充
# 建议
- 在一些重要的条件分支处,建议打日志,这样有助于快速定位问题
- 在对接一些三方接口上,强烈建议打日志
- 使用{} 占位符,而不是字符串拼接
- 判断debug模式是否开启
if(log.isDebugEnable()){
log.debug("日志打得好,问题发现得早")
}
2
3