尝试数种方法:
1. appender
RollingFileAppender<ILoggingEvent> rolling = ( RollingFileAppender<ILoggingEvent>)context.getlogger("ROOT").getAppender("XXX");
rolling.stop();
RollingPolicy rp = rolling.getRollingPolicy();
TriggeringPolicy<ILoggingEvent> tp = rolling.getTriggeringPolicy();
//以下三个file必须清空,另外两个至少一个清空,否则重新设置file会报error
rolling.setRollingPolicy(null);
rolling.setTriggeringPolicy(null);
rolling.setFile(null);
rolling.setRollingPolicy(rp);
rolling.setTriggeringPolicy(tp);
rolling.setFile("D:\\log.log");
rolling.start();
该方法重启后由于logback重新加载配置文件会失效需要重新修改。
2.手动加载配置文件
JoranConfigurator jc = new JoranConfigurator();
jc.setContext(context);
context.reset();
jc.doConfigure(new File("D:\\logback.xml"));
该方法存在与第一种方法一样的问题,并且需要额外的配置文件更麻烦。
3.通过define实现
在logback.xml用define声明一个变量
<define name="LOG_HOME" calss="com.java.test.GetLogHome"/>
该GetLogHome类需要继承PorpertyDefinerBase并重写getPorpertyValue方法(可以从配置文件、数据库或者内存中读).
每次发生路径的变更,通过调用logback提供的jmx的reloadDefaultConfiguration方法重新加载默认配置即可。
该方法只要对应的配置文件或者数据库修改,每次重启后修改过的配置任然有效不需要手动操作。