1、搭建环境
搭建日志框架非常简单,需要引入logback-classic和slf4j.api依赖。logback.version替换为对应的版本即可
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency>
2、HelloWorld示例
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.core.util.StatusPrinter; public class HelloWorld { public static void main(String[] args) { // 工厂模式,通过getLogger方法获取Logger对象,它的全名为org.slf4j.Logger // 工厂方法的参数可以是类全名,也可以是其对应的Class类 Logger logger = LoggerFactory.getLogger(HelloWorld.class); // 定义了一条logging statement,它的level为debug,它的message为"Hello World" logger.debug("Hello World"); // 获取日志框架的上下文,它等同于applicationContext在spring框架中的地位 LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); // 打印出日志框架运行的详细日志,也可以理解为分析LoggerContext对象的生命周期。 StatusPrinter.print(context); } }
运行日志如下:
17:04:25.470 [main] DEBUG learn.logback.chapter1.HelloWorld - Hello World 17:04:25,441 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml] 17:04:25,441 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy] 17:04:25,441 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml] 17:04:25,442 |-INFO in ch.qos.logback.classic.BasicConfigurator@31221be2 - Setting up default configuration.
Logback在运行时总共经历了4步:
第一步,它首先去查找classpath路径下的logback-test.xml配置文件。
第二步,查找失败之后,继续查找logback.groovy配置文件。
第三步,如果还失败,继续查找logback.xml配置文件。
第四步,如果上述三个文件都没有找到,使用默认的配置。最后的日志显示它是BasicConfigurator类。
3、BasicConfigurator
它继承ContextAwareBase类,并实现Configurator接口,只有一个默认的构造器和configure方法。
// 没有实际意义,打印日志 addInfo("Setting up default configuration."); // 添加默认的配置的Appender,ConsoleAppender,并设置默认的Encoder ConsoleAppender<ILoggingEvent> ca = new ConsoleAppender<ILoggingEvent>(); ca.setContext(lc); ca.setName("console"); LayoutWrappingEncoder<ILoggingEvent> encoder = new LayoutWrappingEncoder<ILoggingEvent>(); encoder.setContext(lc); // same as // PatternLayout layout = new PatternLayout(); // layout.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"); TTLLLayout layout = new TTLLLayout(); layout.setContext(lc); layout.start(); encoder.setLayout(layout); ca.setEncoder(encoder); ca.start(); // 添加默认的根Logger,之后会学习到logger的逻辑结构为树形结构,树的跟为Logger.ROOT_LOGGER_NAME,这个常量的值为root,所有logger从根logger中继承Appender Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME); rootLogger.addAppender(ca);