什么是 logback
Logback 为取代 log4j 而生。
Logback 由 log4j 的创立者 Ceki Gülcü 设计。以十多年设计工业级记录系统的经验为基础,所创建的 logback 比现有任何记录系统更快、占用资源更少,有时差距非常大。
Logback 提供独特而实用的特性,比如 Marker、参数化记录语句、条件化堆栈跟踪和强大的事件过滤功能。以上列出的仅仅是 logbook 实用特性的一小部分。
对于自身的错误报告,logback 依赖状态(Status)对象,状态对象极大地简化了故障查找。你也许想在上下文中使用状态对象而不是记录。
Logback-core 附带了 Joran,Joran 是个强大的、通用的配置系统,你可以在自己的项目里使用 Joran 以获得巨大的作用。
第一步
必要条件
Logback-classic 依赖 slf4j-api.jar 和 logback-core.jar。
现在让我们开始体验 logback。
示例 1.1:记录基本模版
(logback-examples/src/main/java/chapters/introduction/HelloWorld1.java)
package chapters.introduction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld1 {
public static void main(String[] args) {
Logger logger = LoggerFactory
.getLogger("chapters.introduction.HelloWorld1");
logger.debug("Hello world.");
}
}
HelloWorld1 类导入了 SLF4J API 定义的 Logger 类和 LoggerFactory 类,更明确地说是定义在 org.slf4j 包里的两个类。
main()方法的第一行里,调用 LoggerFactory 类的静态方法 getLogger 取得一个 Logger实例,将该实例赋值给变量logger。这个 logger被命名为“chapters.introduction.HelloWorld1”。
main 方法继续调用这个 logger 的 debug 方法并传递参数“Hello world”。我们称之为 main方法包含了一条消息是“Hello world”、级别是 DEBUG 的记录语句。
注意上面的例子并没有引用任何 logback 的类。多数情况下,只要涉及到记录,你只需要引用 SLF4J 的类。因此在绝大多数情况下,你的类只导入 SLF4J 的 API,基本可以忽略logback 的存在。
运行示例程序:java chapters.introduction.HelloWorld1
运行后会在控制台输出下面的一行文字。得益于 logback 提供了默认配置策略,当没有发现默认配置文件时,logback 会为根(root) logger 添加一个 ConsoleAppender。20:49:07.962 [main] DEBUG chapters.introduction.HelloWorld1 - Hello world.
Logback 可以通过内置的状态系统来报告其内部状态。通过 StatusManager 组件可以访问 logback 生命期内发生的重要事件。目前,我们调用 StatusPrinter 类的 print()方法来打印logback 的内部状态。
示例 1.2:打印 Logger 状态
(logback-examples/src/main/java/chapters/introduction/HelloWorld2.java)
package chapters.introduction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.util.StatusPrinter;
public class HelloWorld2 {
public static void main(String[] args) {
Logger logger = LoggerFactory
.getLogger("chapters.introduction.HelloWorld2");
logger.debug("Hello world.");
// print internal state
LoggerContext lc = (LoggerContext)
LoggerFactory.getILoggerFactory();
StatusPrinter.print(lc);
}
}
运行后输出如下:
12:49:22.203 [main] DEBUG chapters.introduction.HelloWorld2 - Hello world.
12:49:22,078 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find
resource [logback-test.xml]
12:49:22,093 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find
resource [logback.xml]
12:49:22,093 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Setting up default
configuration.
Logback 说它没有找到配置文件 logback-test.xml 和 logback.xml(稍后解释),于是用默认策略进行配置,即用一个基本的 ConsoleAppender。Appender 类可被视为输出目的地的。
Appender 包含许多不同类型的目的地,包括控制台、文件、Syslog、TCP 套接字、JMS 和其他。用户可以很容易地自定义 Appender。
当发生错误时,logback 将自动在控制台上打印其内部状态。
之前的两个示例相当简单,大型程序里真实记录志情况也不会有太大区别。记录系统的基本模式不会改变,可能改变的是配置过程。也许你想按照自己的需要来定制或配置 logback,之后的章节会讨论配置 logback。
在上面的例子里,我们调用 StatusPrinter.pring()方法来打印 logback 的内部状态。在诊断与 logback 相关的问题时,logback 的内部状态信息会非常有用。
在应程序里启用记录的三个必需步骤如下:
- 配置 logback 环境。方法有繁有简,稍后讨论。
- 在每个需要执行记录的类里,调用 org.slf4j.LoggerFactory 类的 getLogger()方法获取一个 Logger 实例,以当前类名或类本身作为参数。
- 调用取得的 logger 实例的打印方法,即 debug()、info()、warn()和 error(),把记录输出到配置里的各 appender。
构建 logback
Logback 使用 Maven2 进行构建。
安装 Maven2 后,解压 logback 发行包,在解压后的目录下执行 mvn package 命令,就可以构建整个 logback 项目,包括各个模块。Maven 会自动下载所需外部类库。
Logback 发行包包含完整的源代码,你可以修改源代码,创建自己的版本。你还可以发布修改过的版本,前提是遵守 LGPL 或 EPL。
Logback 在以下 JDK 进行过构建和测试。
JDK | Operating System | |||
Sun JDK 1.5.0.06 | Windows XP | |||
Sun JDK 1.5.0.08 | Linux 64bit AMD | |||
WebLogic JRockit 1.5.0.14 | Linux 64bit AMD | |||
IBM JDK 1.6.0.1 | Linux 64bit AMD | |||
Sun JDK 1.6.0.16 (64 bit) | Windows 7 (64 bit) |