1. Logback采取下面的步骤进行自我配置
1.1. 尝试在classpath下查找文件logback-test.xml;
1.2. 尝试在classpath下查找文件logback.groovy;
1.3. 如果文件不存在, 则查找文件logback.xml;
1.4. 如果两个文件都不存在, logback用BasicConfigurator自动对自己进行配置, 这会导致记录输出到控制台。最后一步是为了在缺少配置文件时提供默认(但基本的)记录功能。
2. 自动配置
2.1. 假设配置文件logback-test.xml、logback.groovy和logback.xml都不存在, 那么logback默认地会调用BasicConfigurator, 创建一个最小化配置。最小化配置由一个关联到根logger的ConsoleAppender组成。输出用模式为%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n的PatternLayoutEncoder进行格式化。还有, 根logger默认级别是DEBUG。
3. 用logback-test.xml或logback.xml自动配置
3.1. 如果classpath里有logback-test.xml或logback.xml, logback会试图用它进行自我配置。下面的配置文件与没有配置文件时, 默认调用BasicConfigurator创建最小化配置是等效的。
<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder charset="UTF-8">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root>
<appender-ref ref="stdout" />
</root>
</configuration>
4. 配置打印内部信息
4.1. 设置configuration元素的debug属性为true, 会打印logback状态数据。
4.2. 新建一个名称为LogbackCfg的Java项目, 添加相关jar包
4.3. 新建一个名为config的source folder, 在config文件夹下创建logback-test.xml配置文件
4.4. 编辑logback-test.xml
<configuration debug="true">
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder charset="UTF-8">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root>
<appender-ref ref="stdout" />
</root>
</configuration>
4.5. 编写PrintStatusByCfg.java
package com.zr.cfg;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PrintStatusByCfg {
private final static Logger logger = LoggerFactory.getLogger(PrintStatusByCfg.class);
public static void main(String[] args) {
logger.info("configuration debug = true时, 会打印内部信息。");
}
}
4.6. 运行项目
5. 配置文件修改后自动重新加载
5.1. 如果设置成自动重新加载, logback-classic会扫描配置文件里的变化, 并且当发生变化后进行重新配置。设置访方法是设configuration元素的scan属性为true。
<configuration scan="true">
...
</configuration
5.2. 默认情况下, 每隔一分钟扫描一次。 configuration元素的scanPeriod属性控制扫描周期, 其值可以带时间单位, 包括: milliseconds、seconds、minutes和hours。
<configuration scan="true" scanPeriod="30 seconds">
...
</configuration>
5.3. 如果没写明时间单位, 则默认为毫秒。
5.4. 内部实现是这样的, 当设置扫描属性为true时, 会安装一个叫ReconfigureOnChangeFilter的TurboFilter。每次调用logger的打印方法时, 都会进行扫描。比如, 当名为myLogger的logger执行"myLogger.debug("hello");"时, 如果scan属性为true, 则ReconfigureOnChangeFilter会被调用。而且, 即使myLogger的debug级别被禁用了, 仍然会调用上述过滤器。
5.5. 考虑到在任何logger在每次被调用时都要调用ReconfigureOnChangeFilter, 这个过滤器的性能就变得十分关键了。为提高性能, 不会在每个logger被调用时去检查是否需要扫描, 而是每隔16次记录操作进行一次检查。简言之, 当配置文件改变后, 它会被延时重新加载, 延时时间由扫描间隔时间和一些logger调用所决定。
6. 直接调用JoranConfigurator
6.1. Logback依赖Joran, Joran是logback-core的一部分, 是个配置类库。Logback的默认配置机制是调用JoranConfigurator对classpath上的默认配置文件进行处理。不管出于什么理由, 如果你想重新实现logback的默认配置机制的话, 你可以直接调用JoranConfigurator。
6.2. 创建一个名为的Java项目, 同时添加相关jar包
6.3. 新建cfg文件夹, 在cfg下创建logback.xml
6.4. 编辑logback.xml
<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder charset="UTF-8">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root>
<appender-ref ref="stdout" />
</root>
</configuration>
6.5. 编辑CodeUseCfg.java
package com.zr.cfg;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.core.joran.spi.JoranException;
public class CodeUseCfg {
private static final Logger logger = LoggerFactory.getLogger(CodeUseCfg.class);
public static void main(String[] args) {
// 上下文
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
// Joran配置文件处理类
JoranConfigurator cfg = new JoranConfigurator();
cfg.setContext(lc);
// 上下文已经读取配置文件或使用默认配置文件, 这里进行重置操作。
lc.reset();
try {
cfg.doConfigure("cfg/logback.xml");
} catch (JoranException e) {
e.printStackTrace();
}
logger.info("使用代码设置配置文件");
}
}
6.6. 运行结果
7. html查看状态消息
7.1. Logback把内部数据放在一个StatusManager对象里,并通过LoggerContext访问。
7.2. StatusManager通过logback上下文来访问所有数据对象。为把内存占用保持在合理的范围内,默认的StatusManager实现将状态消息按头和尾两部分存储。头部存储开始的H条状态消息,尾部存储后面的T条消息。现在的H=T=150,将来或许会改变。
7.3. Logback-classic带了一个叫ViewStatusMessagesServlet的Servlet,它以HTML表格的格式打印与当前LoggerContext关联的StatusManager的内容。
7.4. 新建一个名为ViewStatusMessagesServlet的动态Web工程, 同时添加相关jar包
7.5. 在web.xml里配置servlet
7.6. 发送请求