Java 更改logback级别并保存到logback.xml

Java 更改logback级别并保存到logback.xml,java,logback,Java,Logback,因此,我正在为我的java应用程序使用logback,现在客户端希望能够从GUI更改日志级别(并尽快传播),我知道有两种方法可以做到这一点: Logger root = (Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); root.setLevel(Level.INFO); or <configuration scan="true" scanPeriod="30 seconds"> Logger root=(Logg

因此,我正在为我的java应用程序使用logback,现在客户端希望能够从GUI更改日志级别(并尽快传播),我知道有两种方法可以做到这一点:

Logger root = (Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
root.setLevel(Level.INFO);
or
<configuration scan="true" scanPeriod="30 seconds"> 
Logger root=(Logger)LoggerFactory.getLogger(Logger.root\u Logger\u NAME);
root.setLevel(Level.INFO);
或
问题是我想更新logback.xml文件中的级别,以便它自动扫描它,但在将来的会话中,它也可以从xml中读取更改的级别。我很想解析整个文件来寻找这篇文章:

<root>
      <level value="debug"/>


手动更改,但必须有更好的方法将其写入conf文件。

我建议将日志级配置存储在单独的属性文件中,如

root_log_level=INFO
此文件可以包含在logback.xml中,并从中使用变量

<configuration scan="true">

  <property scope="local" file="logback_root_level.properties" />


  <root level="${root_log_level}">
   ...
  </root>
</configuration>

...

请注意,变量的作用域应该是本地的,这将在重新扫描配置时刷新其值。

更改单独的属性文件不会使logback配置重新加载。您还需要更改
logback.xml
文件修改日期以强制重新加载。这将重新加载单独属性文件中的属性。

单独属性文件中的更改不会反映回更改。我找到了解决办法

您需要包含单独的xml文件,该文件包含诸如named LOGBackIncludedFile.xml之类的属性

<property name="LOG_LEVEL" value="OFF"/>

并在logback.xml中包含此文件

<configuration scan="true" scanPeriod="10 seconds">

    <include file="D:/LOGBackIncludedFile.xml" />

     <root>
        <level value="${LOG_LEVEL}" />
        <appender-ref ref="app" />      
     </root>    
</configuration>


并重新启动服务器一次,然后对属性值的动态更改将反映回来。

您可以将日志级别作为环境变量传递 导出日志\u级别=信息


...

在logback.xml中,这是一个不错的解决方案,我最终解析了xml并更改了所需的值,因为有两个地方可以设置根级别您可以在这两个地方使用变量
<configuration scan="true">

  <property scope="local" file="logback_root_level.properties" />


  <root level="${root_log_level}">
   ...
  </root>
</configuration>