07_logback配置一

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包

07_logback配置一

4.3. 新建一个名为config的source folder, 在config文件夹下创建logback-test.xml配置文件

07_logback配置一

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. 运行项目

07_logback配置一

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包

07_logback配置一

6.3. 新建cfg文件夹, 在cfg下创建logback.xml

07_logback配置一

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. 运行结果

07_logback配置一

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包

07_logback配置一

7.5. 在web.xml里配置servlet

07_logback配置一

7.6. 发送请求

07_logback配置一

上一篇:springboot elk


下一篇:spring boot工程快速配置logback输出日志到文件【示例】