修改logback.xml配置文件在resource以外位置

因为spring搭建的web项目打包时默认将resource文件夹下的文件一起打包,但是我们又想在打包后修改某些配置

这里以我遇到的logback.xml配置更改默认路径来看


根据LoggerFactory.getLogger的方法找到加载文件的位置,如下
 public URL findURLOfDefaultConfigurationFile(boolean updateStatus) {
        ClassLoader myClassLoader = Loader.getClassLoaderOfObject(this);
        URL url = findConfigFileURLFromSystemProperties(myClassLoader, updateStatus);
        if (url != null) {
            return url;
        }
        url = getResource(TEST_AUTOCONFIG_FILE, myClassLoader, updateStatus);
        if (url != null) {
            return url;
        }
        url = getResource(GROOVY_AUTOCONFIG_FILE, myClassLoader, updateStatus);
        if (url != null) {
            return url;
        }
        return getResource(AUTOCONFIG_FILE, myClassLoader, updateStatus);
    }
可以看出是根据顺序依次往下寻找配置文件位置,在该类的属性中定义了对应的变量值如下
public class ContextInitializer {

    final public static String GROOVY_AUTOCONFIG_FILE = "logback.groovy";
    final public static String AUTOCONFIG_FILE = "logback.xml";
    final public static String TEST_AUTOCONFIG_FILE = "logback-test.xml";
    final public static String CONFIG_FILE_PROPERTY = "logback.configurationFile";
具体加载顺序参照静态变量上面代码块的查找顺序
那么我们想修改配置文件位置,只需找到第一个加载的方法中是如何加载的,因为后面加载文件的位置都是代码默认写死了的
可以看到上面代码块中,最先加载的代码块是
 URL url = findConfigFileURLFromSystemProperties(myClassLoader, updateStatus);
        if (url != null) {
            return url;
        }

点进去之后可以看到

private URL findConfigFileURLFromSystemProperties(ClassLoader classLoader, boolean updateStatus) {
        String logbackConfigFile = OptionHelper.getSystemProperty(CONFIG_FILE_PROPERTY);
这里可以看到OptionHelper.getSystemProperty(CONFIG_FILE_PROPERTY)传入的是静态变量中的
 final public static String CONFIG_FILE_PROPERTY = "logback.configurationFile";</div>
<div>OptionHelper.getSystemProperty中的内容是</div>
 public static String getSystemProperty(String key) {
        try {
            return System.getProperty(key);
        } catch (SecurityException e) {
            return null;
        }
    }

可以看出是从 System.getProperty()中获取的,而key是静态变量。

所以我们只要在系统启动时,设置一个System.setProperty()就可以了,如下
这一步设置配置文件路径
private static final Logger log;
    static {
        System.setProperty("logback.configurationFile","./logback.xml");
        log = LoggerFactory.getLogger(MonitorApplication.class);
    }
就是根据代码里定义的key,传一个文件路径的value到System的Peoperty里
提示:此方式与@Slf4j一起使用时,在设置 System.setProperty()代码块之前就加载的类中不适用,因为此时还未设置文件位置,但是静态常量就已经被加载赋值了,比如下面我在main方法中这么定义,main方法中的日志将失去配置文件效果
private static final Logger log = LoggerFactory.getLogger(MonitorApplication.class);;
    static {
        System.setProperty("logback.configurationFile","./logback.xml");
    }
     public static void main(String[] args) {}
因为如果在定义时就赋值,那么jvm是先加载 静态属性,然后在执行静态代码块的,所以导致System.setProperty()赋值在 log变量赋值以后执行,那么设置的文件位置也就不生效了

@Slf4j注解也一样,@Slf4j注解后生成的class是下面这样的:
public class MonitorApplication {
    private static final Logger log = LoggerFactory.getLogger(MonitorApplication.class);
所以我们可以选择下面这中jvm启动时带的参数

修改logback.xml配置文件在resource以外位置_第1张图片

打包后的控制台启动设置参数可以百度一下,下面是我打包后控制台启动的参数设置例子


修改logback.xml配置文件在resource以外位置_第2张图片

java -Dlogback.configurationFile=./logback.xml -jar monitor-1.0-SNAPSHOT.jar

你可能感兴趣的:(java,java,logback)