Logback介绍
Logback 分为三个模块:Core、Classic 和 Access。Core模块是其他两个模块的基础。 Classic模块扩展了core模块。 Classic模块相当于log4j的显著改进版。Logback-classic 直接实现了 SLF4J API。
要引入logback,由于Logback-classic依赖slf4j-api.jar和logback-core.jar,所以要把slf4j-api.jar、logback-core.jar、logback-classic.jar,添加到要引入Logback日志管理的项目的class path中.
Logback的配置
Logger、Appender和 Layout
Logback建立于三个主要类之上:Logger、Appender 和 Layout。Logger类是logback-classic模块的一部分,而Appender和Layout接口来自logback-core。作为一个多用途模块,logback-core 不包含任何 logger。
Logger作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。Appender主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、 MySQL、 PostreSQL、 Oracle和其他数据库、 JMS和远程UNIX Syslog守护进程等。Layout 负责把事件转换成字符串,格式化的日志信息的输出。
Logger context
各个logger 都被关联到一个 LoggerContext,LoggerContext负责制造logger,也负责以树结构排列各 logger。
如果 logger的名称带上一个点号后是另外一个 logger的名称的前缀,那么,前者就被称为后者的祖先。如果 logger与其后代 logger之间没有其他祖先,那么,前者就被称为子logger 之父。比如,名为 "com.foo""的 logger 是名为"com.foo.Bar"之父。root logger 位于 logger 等级的最顶端,root logger 可以通过其名称取得,如下所示:
Logger rootLogger =LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
其他所有logger也通过org.slf4j.LoggerFactory 类的静态方法getLogger取得。 getLogger方法以 logger 名称为参数。用同一名字调用LoggerFactory.getLogger 方法所得到的永远都是同一个logger对象的引用。
有效级别与级别继承
Logger 可以被分配级别。级别包括:TRACE、DEBUG、INFO、WARN 和 ERROR,定义于 ch.qos.logback.classic.Level类。如果 logger没有被分配级别,那么它将从有被分配级别的最近的祖先那里继承级别。root logger 默认级别是 DEBUG。
打印方法与基本选择规则
打印方法决定记录请求的级别。例如,如果 L 是一个 logger 实例,那么,语句 L.info("..")是一条级别为 INFO 的记录语句。记录请求的级别在高于或等于其 logger 的有效级别时被称为被启用,否则,称为被禁用。
记录请求级别为 p,其 logger的有效级别为 q,只有则当 p>=q时,该请求才会被执行。
该规则是 logback 的核心。级别排序为: TRACE < DEBUG < INFO < WARN < ERROR。
Logger、Appenders及layouts的关系
一个 logger 可以被关联多个 appender。方法 addAppender() 为指定的 logger 添加一个 appender。对于 logger 的每个启用了的记录请求,都将被发送到 logger 里的全部 appender 及更高等级的 appender。换句话说,appender叠加性地继承了 logger 的层次等级。
Logger L的记录语句的输出会发送给 L及其祖先的全部 appender。如果 logger L的某个祖先 P设置叠加性标识为 false,那么,L的输出会发送给L 与 P之间(含P)的所有 appender,但不会发送给P的任何祖先的appender。
Logger 的叠加性默认为 true。如果希望定制输出格式。这时为 appender 关联一个 layout 即可。Layout 负责根据用户意愿对记录请求进行格式化,appender 负责将格式化化后的输出发送到目的地。
例如,转换模式"%-4relative [%thread] %-5level %logger{32} - %msg%n"在 PatternLayout里会输出形如:
176 [main] DEBUG manual.architecture.HelloWorld2 - Hello world.
第一个字段是自程序启动以来的逝去时间,单位是毫秒。
第二个地段发出记录请求的线程。
第三个字段是记录请求的级别。
第四个字段是与记录请求关联的 logger 的名称。
"-"之后是请求的消息文字。
Logback的默认配置
如果配置文件 logback-test.xml 和 logback.xml 都不存在,那么 logback 默认地会调用BasicConfigurator ,创建一个最小化配置。最小化配置由一个关联到根 logger 的ConsoleAppender 组成。输出用模式为%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 进行格式化。root logger 默认级别是 DEBUG。
logback配置文件
Logback 配置文件的语法非常灵活。正因为灵活,所以无法用 DTD 或 XML schema 进行定义。尽管如此,可以这样描述配置文件的基本结构:以<configuration>开头,后面有零个或多个<appender>元素,有零个或多个<logger>元素,有最多一个<root>元素。
Logback默认配置的采用的步骤
1. 尝试在 classpath 下查找文件 logback-test.xml;
2. 如果文件不存在,则查找文件 logback.xml;
3. 如果两个文件都不存在,logback 用 Bas icConfigurator 自动对自己进行配置,这会导致记录输出到控制台。
假设配置文件 logback-test.xml 和 logback.xml 都不存在,那么 logback 默认地会调用BasicConfigurator ,创建一个最小化配置。最小化配置由一个关联到根 logger 的ConsoleAppender 组成。输出用模式为%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 进行格式化。还有,根 logger 默认级别是 DEBUG。
最简单的配置方法就是使用默认配置。以下是logback用BasicConfigurator 配置的简单例子:
package com.ttpod.chapters.configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
publicclass MyApp1 {
finalstatic Logger logger = LoggerFactory.getLogger(MyApp1.class);
publicstaticvoid main(String[] args) {
logger.info("Entering application."); //进行另一个application中
Foo foo = new Foo();
foo.doIt(); //执行其它中的日志输出方法
logger.info("Exiting application."); //退出另一个application
}
}
该类定义了一个静态变量 logger,然后实例化一个 Foo 对象。Foo 类如下
package com.ttpod.chapters.configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
publicclass Foo {
staticfinal Logger logger = LoggerFactory.getLogger(Foo.class);
publicvoid doIt() {
logger.debug("Did it again!"); //定义一个debug级别的日志输出
}
…………
}
自动打印警告和错误消息
当解析配置文件有警告或出错时,logback 会在控制台上自动打印状态数据。如果没有警告或错误,还是想检查 logback 的内部状态的话,可以调用 StatusPrinter 的 print()方法。示例如下:
finalstatic Logger logger = LoggerFactory.getLogger(MyApp2.class);
publicstaticvoid main(String[] args) {
// 在当前环境中假设 SLF4J 已经被绑定到logback
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
// 打印logback的内部状态
StatusPrinter.print(lc);
…………
}
}
对应的配置文件:
<?xmlversion="1.0"encoding="UTF-8"?>
<configuration>
<!--定义一个名为STDOUT的appender,并将其关联到ch.qos.logback.core.ConsoleAppender-->
<appendername="STDOUT"
或"NULL"。 <logger>元素可以包含零个或多个<appender-ref>元素。与<logger>元素类似,声明<root>元素后,会先关闭然后移除全部当前 appender,只引用声明了的 appender。如果 root 元素没有引用任何 appender,就会失去所有 appender。
假设我们不想看到"com.ttpod.file"包里的任何组件的任何 DEBUG 信息,可以设置如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<configuration>
<appendername="STDOUT"chapters.configuration.Foo"将且仅仅将输出到文件 foo.log。
Layout格式化输出日志
配置自定义 layout
配置自定义layout与配置其他layout是一样的。 FileAppender和其子类需要一个encoder。如链接中的例子:http://logback.qos.ch/xref/chapters/layouts/MySampleLayout.html
此类中定义了一个处理格式的输出类,为了满足自定义的格式化的输出,把包裹了 MySampleLayout 的 LayoutWrappingEncoder 实例传递给FileAppender。下面是配置文件:
<configurationdebug="true">
<appendername="STDOUT"+ i);
Thread.sleep(100);
}
Foo foo = new Foo();
foo.createLoggingRequest();
}
}
配置文件:
(com/ttpod/file/MyApp3-RollingFixedWindow.xml)
<configuration>
<!-- 指定属性文件路径 -->
<propertyfile="src/com/ttpod/file/variables.properties"/>
<appendername="FILE"+ i); //声明一条warn级别的日志消息
//logger.info("a warning message " + i);
} else {
logger.debug("hello world number" + i);
}
}
logger.error("Finish off with fireworks", new Exception("Just testing"));
}
}
用以下配置文件格式化输出到properties文件指向的目的地。
(com/ttpod/html/htmlLayoutConfig1.xml)
<configuration>
<!-- 指定属性文件路径 -->
<propertyfile="src/com/ttpod/html/variables.properties"/>
<!-- 指定日志输出到文件-->
<appendername="FILE"+ i);
} else {
logger.warn("This is a warning message. Message number: " + i);
}
}
//定义一条error级别的日志输出
logger.error("At last an error.", new Exception("Just testing"));
//打印logger内部状态
StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
}
staticvoid usage(String msg) { //当参数传入错误时,提供的处理惯例
System.err.println(msg);
System.err.println("Usage: java " + EMail.class.getName() +
" runLength configFile\n" +
" runLength (integer) the number of logs to generate\n" +
" configFile a logback configuration file in XML format." +
" XML files must have a '.xml' extension.");
System.exit(1); //退出程序
}
}
如下配置文件从属性文件中读取发送邮件定义的属性,配置由邮件输出日志,如下:
<configuration>
<!-- 指定属性文件的位置 -->
<propertyfile="src/com/ttpod/mail/gmailSSL.properties"/>
<!-- 目的指定向email的appender -->
<appendername="EMAIL"/>
谢谢支持