logback学习记录 Logger、Appenders和Layouts

Logback分为了三个模块,logback-core、logback-classic、logback-access。

logback-core模块是其他两个模块的基础。classic模块拓展了core模块。access模块集成Servlet容器为HTTP-access提供日志功能。

后面提到的Logback,指的是Logback-classic。

Logger、Appenders和Layouts

Logback建立在Logger、Appenders和Layouts三个主要类上。

Logger类是logger-classic模块的一部分,Appender和Layout接口来自Logback-core。

Logger context

任何比System.out.println更高级的logging API最重要的优点是能够在禁用特定的记录语句同时却不妨碍输出其他语句。

Logger是一个命名了的实体,大小写敏感。

命名规则:如果logger的名称带上一个点好后是另一个logger的名称前缀,那么,前者就被成为后者的祖先。如果logger与其后代的logger之间没有其他祖先,那么前者就被称为子logger的父logger。

所有的logger都可以通过静态方法getLogger获取到。用同一名字调用LoggerFactory.getLogger方法得到的永远都是同一个logger对象的引用。

如:
logger x = LoggerFactory.getLogger(“weiyiysw”);
logger y = LoggerFactory.getLogger(“weiyiysw”);

x 和 y指向同一个logger对象。

输出有效级别的继承

Logger可以被分配级别。级别包括:TRACE、DEBUG、INFO、WARN、ERROR。

如果logger没有分配级别,那么它将从有被分配的级别的最近的祖先那里继承级别。

为确保每个logger最终都能继承一个级别,根logger总是有级别的,默认情况下,这个级别是DEBUG。

打印方法和基本选择规则

基本选择规则:记录请求级别为P,其logger的有效级别为Q,只有在P >= Q时,该请求才会执行。

级别排序

TRACE < DEBUG < INFO < WARN < ERROR

Appender 和 Layout

在logback里,一个输出目的地就是一个appender。

一个logger可以关联到多个appender。

Appender的叠加性:Logger L的记录语句的输出会发送给L及其祖先的全部appender。然而,如果Logger L的某个祖先P,设置additivity为FALSE,那么L的输出会发送给L与P之间的(含P)的所有Appender,但不会发送给P的任何祖先Appender。

additivity叠加性默认为TRUE。

Layout负责根据用户的意愿,格式化输出记录。Appender负责将格式化后的输出发送到目的地。

PatternLayout是标准logback发行包的一部分,允许用户按照类似于C语言的printf函数的转换模式设置输出格式。

例如: %-4relative [%thread] %-5level %logger{32} - %msg%n

输出:176 [main] DEBUG manual.architecture.HelloWorld2 - Hello world.

第一个字段是自程序启动以来的逝去时间,单位是毫秒。

第二个地段发出记录请求的线程。

第三个字段是记录请求的级别。

第四个字段是与记录请求关联的 logger 的名称。

“-”之后是请求的消息文字。

参数化

对于某个Logger,下面的代码:

logger.debug("Entry number:" + i + "is " + String.valueOf(entry[i]));

在构造消息参数时有性能消耗,即把整数i和entry[i]都转换为字符串时、连接多个字符串时。不管消息是否被几率,都会造成上述消耗。

替代方法

假设entry是一个object,你可以编写:

Object entry = new SomeObject();
logger.debug("The entry is {}.", entry);

在评估是否作记录后,仅当需要作记录时,logger才会格式化消息,用entry的字符串值替换为“{}”。即,当语句被禁用时,这种方法不会产生参数构造所带来的性能消耗。