Java 如何在执行时更改log4j2中的日志路径

Java 如何在执行时更改log4j2中的日志路径,java,slf4j,log4j2,Java,Slf4j,Log4j2,嗨,我在log4j2上使用slf4j。 如何动态更改日志路径 我的log4j2.xml看起来像 <Properties> <Property name="home">/path/logs</Property> </Properties> <Appenders> <RollingFile name="default" fileName="${home}/error.log"

嗨,我在log4j2上使用slf4j。 如何动态更改日志路径

我的log4j2.xml看起来像

   <Properties>
        <Property name="home">/path/logs</Property>
    </Properties>
    <Appenders>
        <RollingFile name="default" fileName="${home}/error.log"
                     filePattern="...">
               .......

        </RollingFile>
    </Appenders>

/路径/日志
.......
是否有任何方法可以更改运行时写入日志的路径

我尝试在路径中拥有系统属性并在运行时设置它,但Log4J2不考虑更新的值。系统属性方法-

<RollingFile name="default" fileName="${sys:home}/error.log"
                     filePattern="...">

(In java class: System.setProperty("home","/newPath"))

(在java类中:System.setProperty(“home”,“/newPath”))
这是否需要重新配置。我没有看到slf4j的任何公开服务需要重新配置

Use,其中第二个参数是
LogManager.getLoggerRepository()
。这样,您不仅可以更改日志路径,还可以更改其他所有内容,例如,包括特定记录器的级别


我不认为您可以使用“实现不可知”的方式重新配置SLF4j实现。当我们将应用程序从Log4j切换到Logback时,我们还改变了在运行时重新读取配置文件的方式。对于Logback,它使用
JoranConfigurator.doConfigure()

我得到的唯一解决方案是使用上下文变量

MDC.put("logLocation","path/to/log")
在log4j2.xml中

<RollingFile name="default" fileName="${ctx:logLocation}/error.log"
                 filePattern="...">


然而,关键是,对于每个线程,上下文应该设置这个变量(logLocation)

您在谈论哪个LogManager?“org.apache.logging.log4j.LogManager”和“org.apache.log4j.LogManager”都没有“getLoggerRepository”方法。请指定软件包,你使用log4j2,错过了那个鬼鬼祟祟的2。那就别管了。