【问题标题】:Change Log level at runtime without server restart?在运行时更改日志级别而不重新启动服务器?
【发布时间】:2016-11-04 06:50:20
【问题描述】:

我使用 logback 作为 SL4j 接口的实现。这是配置

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/prod.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">          
        <FileNamePattern>logs/prod.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>700MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
</appender>


    <logger name="com.ecom" additivity="false" level="ERROR">
        <appender-ref ref="FILE" />
    </logger>

我想通过配置或生产中的外部属性更改在运行时将级别更改为信息或调试,而无需重新启动服务器。有可能吗?

仅供参考,我将 Weblogic 用作应用程序服务器,并将 Spring 框架用于其他目的>

【问题讨论】:

标签: java logging logback slf4j


【解决方案1】:

您可以尝试在您的 logback.xml 中包含另一个覆盖配置的文件(在您的 webapp 之外)。

<configuration scan="true" scanPeriod="30 seconds">
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/prod.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">          
      <FileNamePattern>logs/prod.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
         <maxFileSize>700MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
  </appender>

  <logger name="com.ecom" additivity="false" level="ERROR">
    <appender-ref ref="FILE" />
  </logger>

  <include optional="true" file="/tmp/logbackDynamic.xml"/>

</configuration>

如果您想要 com.ecom.SomeClass 的 DEBUG 日志记录,您的 /tmp/logbackDynamic.xml 可能看起来像这样

<included>
  <logger name="com.ecom.SomeClass" level="DEBUG">
    <appender-ref ref="FILE" />
  </logger>
</included>

现在,如果您更改了 /tmp/logbackDynamic.xml 中的配置,Logback 将每 30 秒检查一次,然后重新加载。如果要返回原始日志级别,只需删除标签之间的行,Logback 将忽略 DEBUG 级别。由于 optional="true",您甚至可以删除该文件。

【讨论】:

    【解决方案2】:

    有两种方法可以外部化记录器级别

    1. 一个具有系统级属性的 at,即java -Dlogback.configurationFile=/pathToconfig.xml。见How to externalize the log level

    2. &lt;root level="${log.level:-Error}"&gt;。然后设置系统级属性-Dlog.level=DEBUG

    【讨论】:

      【解决方案3】:

      Variable substitution 是你的朋友。 Default values for variables 也应该有帮助。

      另见variable scoping

      【讨论】:

      • 在您提到的示例中,变量替换用于指定将创建日志文件的位置。它如何用于在运行时更改日志级别?你的意思是我应该创建像&lt;property file="src/main/java/chapters/configuration/variables1.properties" /&gt; which will contain some property like LOG_LEVEL=DEBUG 这样的外部属性文件,然后使用它&lt;root level="${LOG_LEVEL}"&gt;? `
      • 变量替换也适用于“级别”属性。我也在上面修改了我的答案。
      猜你喜欢
      • 1970-01-01
      • 2015-04-01
      • 2016-02-23
      • 2019-05-18
      • 2013-11-06
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      相关资源
      最近更新 更多