Logback旨在成为流行的log4j项目的继任者。它由Ceki Gülcü设计,他是log4j的创始人。它基于十年在设计工业级日志系统方 面的经验。结果产品,即logback,比所有现有的日志系统更快,具有更小的占用空间,有时差距非常大。同样重要的是,logback提供了其他日志系统所缺乏的独特而实用的功能。
为了运行本章中的示例,您需要确保在类路径上存在某些jar文件。请参阅设置页面以获取详细信息。
要求
logback-classic模块需要在类路径上存在slf4j-api.jar和logback-core.jar,除此之外还需要存在logback-classic.jar。
logback-*.jar文件是logback分发包的一部分,而slf4j-api-2.0.7.jar则与SLF4J一起提供,是另一个项目。
让我们现在开始使用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.");
}
}
在chapters.introduction包中定义了HelloWorld1类。它首先导入SLF4J API中定义的Logger和LoggerFactory类,具体在org.slf4j包下。
在main()方法的第一行,变量logger被赋值为通过调用LoggerFactory类的静态getLogger方法获取的Logger实例。
这个logger被命名为“chapters.introduction.HelloWorld1”。main()方法继续调用该logger的debug方法,并将"Hello World"作为参数传递。
我们说main()方法包含一个级别为DEBUG的日志语句,消息为"Hello world"。
请注意,上述示例未引用任何logback类。在大多数情况下,就日志记录而言,您的类只需要导入SLF4J类。
因此,如果不是所有,那么大部分甚至所有的类都将使用SLF4J API,对logback的存在毫不知情。
您可以使用以下命令启动第一个样本应用程序,即chapters.introduction.HelloWorld1:
java chapters.introduction.HelloWorld1
启动HelloWorld1应用程序将在控制台输出一条单行。由于logback的默认配置策略,当找不到默认配置文件时,
logback将向根 logger 添加一个 ConsoleAppender。
20:49:07.962 [main] DEBUG chapters.introduction.HelloWorld1 - Hello world.
Logback可以使用内置的状态系统报告其内部状态。通过称为StatusManager的组件,可以访问在logback生命周期期间发生的重要事件。
目前,我们将通过调用StatusPrinter类的静态print()方法来指示logback打印其内部状态。
示例:打印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);
}
}
运行HelloWorld2应用程序将产生以下输出:
12:49:22.203 [main] DEBUG chapters.introduction.HelloWorld2 - Hello world.
12:49:22,076 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
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是一个类,可以看作是输出目的地。对于许多不同的目的地,包括控制台、文件、Syslog、TCP套接字、JMS等等,存在Appender。
用户也可以根据自己的特定情况轻松创建自己的Appender。
请注意,在出现错误时,logback会自动在控制台中打印其内部状态。
前面的例子比较简单。在大型应用程序中实际进行日志记录并不会有太大不同。一般的日志记录语句模式不会改变。只有配置过程会有所不同。
但是,您可能希望根据自己的需求自定义或配置logback。logback的配置将在后续章节中进行介绍。
请注意,在上面的例子中,我们通过调用StatusPrinter的print()方法来指示logback打印其内部状态。logback的内部状态信息非常有用,可以诊断与logback相关的问题。
启用应用程序日志记录的三个必要步骤如下:
1.配置logback环境。您可以通过多种或更复杂的方式进行配置。稍后会进行讨论。
2.在每个希望进行日志记录的类中,通过调用org.slf4j.LoggerFactory类的getLogger()方法获取Logger实例,并将当前类名或类本身作为参数传递。
3.使用此Logger实例调用其打印方法,即debug(), info(), warn()和error()方法。这将在配置的Appender上产生日志输出。
Logback的构建工具是Maven,这是一款广泛使用的开源构建工具。
一旦您安装了Maven,构建logback项目,包括所有模块,应该很容易,只需从解压logback分发目录的目录中发出mvn install命令即可。Maven将自动下载所需的外部库。
logback分发包含完整的源代码,因此您可以修改logback库的部分,并构建自己的版本。您甚至可以重新分发修改后的版本,只要遵守LGPL许可证或EPL许可证的条件即可。
有关在IDE下构建logback的信息,请参见类路径设置页面的相关部分。