【问题标题】:Overriding logback configurations覆盖 logback 配置
【发布时间】:2014-07-02 07:41:24
【问题描述】:

有什么方法可以覆盖 logback 配置?我知道我们在名为logback.xml 的文件中定义了logback 配置(通常存储在路径src/main/resources 中),并且我知道通过使用<include> 标签我们可以设置一个要添加到logback.xml 的外部文件,如下所示:

<configuration>

<!--<include url="file:///d:/ServerConfig.xml"/>-->
<include file="${outPut}/ServerConfig.xml"/>


<logger name="Server" LEVEL="DEBUG">
    <appender-ref ref="FILEOUT" />
</logger>

<root level="DEBUG">
    <appender-ref ref="STDOUT" />
    <!--<appender-ref ref="FILEOUT" />-->
</root>

</configuration>

但是如果我想覆盖这个默认配置怎么办?例如将根记录器级别设置为 INFO。

这是包含的文件:

<included>

<!-- <property file="d:/ServerSysVar.properties"/>-->
<property file="${outPut}/ServerSysVar.properties"/>


<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>



<appender name="FILEOUT" class="ch.qos.logback.core.FileAppender">
    <file>${Sys_Location}/Serverfile4.log</file>
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} %class{36}.%M %L CLIENT_PORT:%X{ClientPort}- %msg%n</pattern>
    </encoder>
</appender>


<logger name="Service" LEVEL="DEBUG">
    <appender-ref ref="FILEOUT" />
</logger>

 <root>
    <appender-ref ref="STDOUT" />
   <!-- <appender-ref ref="FILEOUT" />-->
</root>

</included>

【问题讨论】:

  • 2011 年报告了一个错误,旨在通过使用系统属性覆盖配置来解决问题 - jira.qos.ch/browse/LOGBACK-239
  • 该讨论表明作者非常固执,拒绝为一些学术废话而改变任何东西。我想知道这个实现怎么还活着?

标签: logging slf4j logback


【解决方案1】:

我认为您不能从包含的文件中覆盖 logback.xml-definitions。

但我有一种方法可以解决您关于覆盖根记录器级别的问题,使用 variable substitution 和默认值:

logback.xml

<configuration>
  <include file="includedFile.xml" />

  <!-- STDOUT appender stuff -->

  <root level="${root.level:-DEBUG}">
    <appender-ref ref="STDOUT" />
  </root>
<configuration>

包含文件.xml

<included>

  <!-- override the default value; or comment out to leave it at default -->
  <property name="root.level" value="INFO" />

</included>

有了这个概念,我什至能够控制包含文件中多个附加程序的输出:

logback.xml

<configuration>
  <include file="includedFile.xml" />

  <!-- STDOUT appender stuff -->

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>${file.level:-ALL}</level>
    </filter>
    <file>/path/to/logfeil.log</file>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>${syslog.level:-OFF}</level>
    </filter>
    <syslogHost>localhost</syslogHost>
    <facility>${syslog.facility:-LOCAL1}</facility>
    <suffixPattern>${syslog.pattern:-[%thread] %logger{36} - %msg}</suffixPattern>
   </appender>

  <logger name="my.package" level="${logging.level:-INFO}" additivity="false">
    <appender-ref ref="FILE" />
    <appender-ref ref="SYSLOG" />
  </logger>

  <root level="${root.level:-DEBUG}">
    <appender-ref ref="STDOUT" />
  </root>
<configuration>

includedFile.xml 中,我可以控制消息是否以及在什么级别通过appender FILESYSLOG,设置属性file.levelsyslog.level,当然还有logging.level

【讨论】:

    【解决方案2】:

    我有一个类似的问题,这个答案似乎是最好的方法。

    就我而言,我需要覆盖包含的文件以完全关闭其中一个附加程序。

    使用 a 变量作为日志级别值,可以将其更改为 OFF。

    <included>
      (...)
      <root level="${root.level.console:-DEBUG}">
        <appender-ref ref="CONSOLE" />
      </root>
      <root level="${root.level.file:-DEBUG}">
        <appender-ref ref="FILE" />
      </root>
    </included>
    

    http://logback.qos.ch/manual/configuration.html#rootElement中所述

    <configuration>
      <include resource="base.xml" />
      (...)
      <property name="root.level.console" value="OFF" />
    </configuration>
    

    【讨论】:

    • 这个变体对我不起作用。我使用 logback 版本 1.1.3。你用的是什么版本?至少它不适用于 appender 的文件标签。我试图从包含的文件中覆盖文件名
    • 很重要/>
    • 文档说“最多一个 元素”,所以如果这可行,那么他们可能不是故意的。似乎最好将 元素放在包含的文件中。
    猜你喜欢
    • 2017-11-05
    • 2011-08-04
    • 2011-09-24
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2013-02-12
    相关资源
    最近更新 更多