logback
同样是由log4j的作者设计完成的,拥有更好的特性,是用来取代 log4j
的一个日志框架。logback
是 slf4j
的原生实现 。
logback
和log4j
的大多数概念类似,这里不作赘述。
认识 Logback
日志架构
涉及 | 说明 |
---|---|
logback-core |
其它两个模块的基础模块。包含Appender 和 Layout 接口 。 |
logback-classic |
它是 log4j 的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统(如 log4j 或 JDK1.4 Logging) 。包含 Logger 对象 。 |
logback-access |
访问模块与Servlet容器集成提供通过Http来访问日志的功能。 |
核心对象
Logger
命名层次结构
和Log4j相同的命名规范和继承关系。
如果记录器的名称后跟一个点是后代记录器名称的前缀,则称该记录器是另一个记录器的祖先。如果记录器本身和后代记录器之间没有祖先,则称记录器是子记录器的父节点。
Appender
Appender
和Logger
具有一样的继承关系。
Appender
控制日志输出目标,例如:控制台,文件,远程套接字服务器,数据库,JMS和远程UNIX Syslog守护程序等。
Layout
Layout
负责定制输出格式,它是通过 Appender
相关联来实现的。
支持对象
LoggerContext
各个logger 都被关联到一个 LoggerContext,LoggerContext负责制造logger,也负责以树结构排列各logger。
Level
- 如果给定的记录器没有分配级别,那么它将 从具有指定级别的最近祖先继承 一个级别。
- 如果Logger请求的级别高于或等于其Logger的有效级别,则为启动,反之禁用。
级别(优先级:desc) | 描述 |
---|---|
OFF |
最高级别,用于关闭日志。 |
FATAL |
指明非常严重的错误事件,可能会导致应用终止执行。 |
ERROR |
指明错误事件,但应用可能还能继续运行。 |
WARN |
指明潜在的有害状况。 |
INFO |
指明描述信息,从粗粒度上描述了应用运行过程。 |
DEBUG |
指明细致的事件信息,对调试应用最有用。 |
TRACE |
比 DEBUG 级别的粒度更细。 |
ALL |
所有级别,包括定制级别。 |
使用 Logback
Logback的默认配置
- 尝试在
classpath
下查找文件logback-test.xml
。 - 若文件不在,则查找
logback.xml
。 - 若两个文件都不在,使用
BasicConfigurator
默认配置,日志输出到控制台。
1 | <!--logback(自动依赖:logback-core,slf4j-api)--> |
logback.xml
appender.encoding
在高版本中不再需要,使用会产生异常。
1 |
|
*.java
1 | package org.Demo; |
附录
优化
logback
已自身优化,不用考虑因为使用日志功能而降低业务执行效率。注意使用占位符即可。
关闭日志时(多参数日志)
java中对String的直接拼接的消耗是巨大的。
由于日志级别Level的限制,一些日志可能不会输出,但是构造消息参数依然会消耗巨大成本。
1 | logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i])); |
方式一
即使输出,所需时间也增加不到 1%
。
1 | if(logger.isDebugEnabled()) { |
方式二
推荐 使用类似 占位符
的方式,在日志被禁用的情况下,至少优化了30倍。
1 | logger.debug("The new entry is {}.", entry); |
开启日志记录时(默认继承)
Logger对象在创建时已明确了日志级别,不会动态继承。在基于有效级别接受或拒绝请求之前,记录器可以做出准瞬时决定,而无需咨询其祖先(不需要遍历记录器层次结构。)。
实际记录(格式化和写入输出设备)
已优化Layout和Appdender,一些logback组件已被重写几次以提高性能。
记录到本地计算机上的文件时,实际记录的典型成本约为9到12微秒。登录到远程服务器上的数据库时,它会持续几毫秒。