一、指定logback加载配置文件的路径
前文讲到,logback在启动时会自动加载放在类路径下的配置文件,那么有没有一种配置,让Logback在启动时加载我们指定位置的配置文件呢,答案是肯定的。
我们通过系统属性 logback.configurationFile 可以指定默认的配置文件的路径。它的值可以是 URL,类路径下的文件或者是应用外部的文件。
通过命令行配置:
java -Dlogback.configurationFile=/path/to/config.xml chapters.configuration.MyApp1
注意文件类型只能是 ".xml" 文件或者 ".groovy" 文件,其他的扩展文件将会被忽略。
因为 logback.configurefile 是系统属性,所以也可以在应用内进行设置。但必须在logger实例创建之前进行设置。
public class TestLogback01 {
//指定配置文件路径
static{
System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY,"src/main/resources/logback.xml");
}
private static Logger logger = LoggerFactory.getLogger(TestLogback01.class);
@Test
public void test(){
logger.info("info....");
}
}
二、配置文件自动热加载
有时候我们可能对配置文件进行更改,为了让logback能够;快速的感知到配置文件的改变,我们可以在<configuration>标签上添加 scan="true" 属性。
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" >
...
</configuration>
添加scan属性后,logback默认一分钟扫描一次配置文件看看是否更改。通过<configuration>标签上的 scanPeriod 属性可以指定扫描周期,单位可以是毫秒、秒、分钟或者小时。如果没有指定时间单位,默认是毫秒。
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
...
</configuration>
当设置scan="true"时,会新建一个 ReconfigureOnChangeTask 任务,用于监视配置文件是否变化。ReconfigureOnChangeTask 也会自定监视外部文件的变化,如果更改后的配置文件有语法错误,则会回退到之前的配置文件。
三、在堆栈中展示包数据
在logback-1.1.4之后,展示包数据是默认禁用的。
如果启用了展示包数据,logback 会在堆栈的每一行显示 jar 包的名字以及 jar 的版本号。展示包数据可以很好的解决 jar 版本冲突的问题。但是,这个的代价比较高,特别是在频繁报错的情况下。
<configuration packagingData="true">
...
</configuration>
也可以通过 LoggerContext 的 setPackagingDataEnabled(boolean) 方法来开启
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
lc.setPackagingDataEnabled(true);
四、直接调用JoranConfiguration
Joran 是 logback 使用的一个配置加载库,如果想要重新实现 logback 的配置机制,可以直接调用这个类JoranConfigurator来实现:
package test.java.TestLogback;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.access.joran.JoranConfigurator;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.util.StatusPrinter;
public class Configurator {
private static final Logger LOGGER = LoggerFactory.getLogger(Configurator.class);
public static void main(String[] args) {
LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
JoranConfigurator joranConfigurator = new JoranConfigurator();
joranConfigurator.setContext(context);
context.reset();
try {
joranConfigurator.doConfigure(args[0]);
} catch (JoranException e) {
e.printStackTrace();
}
StatusPrinter.printInCaseOfErrorsOrWarnings(context);
LOGGER.info("Entering application");
LOGGER.info("Exiting application");
}
}