【问题标题】:Is there a way to configure logback from two separate logback.xml files per log level?有没有办法从每个日志级别的两个单独的 logback.xml 文件配置 logback?
【发布时间】:2017-01-03 11:39:03
【问题描述】:

我在打包的 .war 之外有一个 logback.xml,我必须将其用于 INFO & ERROR 日志记录配置 - 不能对其进行任何更改。 [已编辑:可能会添加一个或类似最小的内容]
目标 我想以这样一种方式设置我的调试日志记录,即每个模块都有自己的 .log 文件等 - 如上所述,我无法将此配置添加到现有的 logback.xml 中。 [编辑于]另外,我需要一种方法来仅为特定模块启用调试 - 最好通过“我的”添加 logback.xml

如何让 logback 仅从不同的 .xml 文件中读取调试配置?

编辑添加示例文件:

main/aka 不可更改的 logback.xml

<?xml version="1.0" encoding="UTF-8"?>

<property scope="system" name="component-name" value="COMPONENT_A" />
<property file="$configuration.yaml" />
<property scope="context" name="enable-all-log" value="false" />

    <property name="default-log-pattern"
    value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{uuid}|%X{instanceID}|%thread||%X{userId}|%level />

<!-- All log -->
<if condition='property("enable-all-log").equalsIgnoreCase("true")'>
    <then>
        <appender name="ALL_ROLLING"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${log.home}/${component-name}/${subcomponent-name}/all.log
            </file>

            <rollingPolicy
                class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                <fileNamePattern>${log.home}/${component-name}/${subcomponent-name}/all.log.%i
                </fileNamePattern>
                <minIndex>1</minIndex>
                <maxIndex>10</maxIndex>
            </rollingPolicy>

            <triggeringPolicy
                class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <maxFileSize>20MB</maxFileSize>
            </triggeringPolicy>
            <encoder>
                <pattern>${default-log-pattern}</pattern>
            </encoder>
        </appender>

        <appender name="ASYNC_ALL" class="ch.qos.logback.classic.AsyncAppender">
            <appender-ref ref="ALL_ROLLING" />
        </appender>
    </then>
</if>

<!-- Error log -->
<appender name="ERROR_ROLLING"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.home}/${component-name}/${subcomponent-name}/error.log
    </file>

    <!-- Audit messages filter - deny audit messages -->
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
            <marker>AUDIT_MARKER</marker>
        </evaluator>
        <onMismatch>NEUTRAL</onMismatch>
        <onMatch>DENY</onMatch>
    </filter>   
<!-- Debug log -->
<appender name="DEBUG_ROLLING"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.home}/${component-name}/${subcomponent-name}/debug.log
    </file>


    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
            <marker>TRANSACTION_MARKER</marker>
        </evaluator>
        <onMismatch>NEUTRAL</onMismatch>
        <onMatch>DENY</onMatch>
    </filter>

    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
            <expression>
                e.level.toInt() &lt;= DEBUG.toInt()
            </expression>
        </evaluator>
        <OnMismatch>DENY</OnMismatch>
        <OnMatch>NEUTRAL</OnMatch>
    </filter>

    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <fileNamePattern>${log.home}/${component-name}/${subcomponent-name}/debug.log.%i
        </fileNamePattern>
        <minIndex>1</minIndex>
        <maxIndex>10</maxIndex>
    </rollingPolicy>

    <triggeringPolicy
        class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
        <maxFileSize>20MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
        <pattern>${default-log-pattern}</pattern>
    </encoder>
</appender>

<root level="INFO">
    <appender-ref ref="ASYNC_ERROR" />
    <appender-ref ref="ASYNC_DEBUG" />
    <if condition='property("enable-all-log").equalsIgnoreCase("true")'>
        <then>
            <appender-ref ref="ALL_ROLLING" />
        </then>
    </if>
</root>

<logger name="foo.bar" level="INFO" />

【问题讨论】:

  • 你说的什么都不能改变是什么意思?
  • 你试过 include 文件了吗?
  • @NewUser 我的意思是它不能被改变,因为它属于其他组(在这里输入无关的政治)并且对于 INFO + ERROR 他们的配置很好。问题是他们以我们不选择遵循的方式实现了调试日志记录,我无法将我的调试记录器的配置添加到现有的 logback.xml
  • @Jobin 哪些文件?附加现有的 logback.xml 没有用,请参阅我对 NewUser 的回复。
  • 日志配置文件.....&lt;include file="/path/to/included/file"/&gt;

标签: java logback


【解决方案1】:

您可以使用 Logback 文件包含机制。

来自documentation

Joran 支持包含来自另一个配置文件的部分内容 文件。这是通过声明一个元素来完成的。

如果你不知道,Joran 是 Logback 依赖的一个组件。您无需添加其他库。
以下是包含配置文件的 3 种方式:

要包含的内容可以作为文件、资源或 作为 URL。

作为文件: 要包含文件,请使用文件属性。可以使用相对路径,但注意当前目录是应用定义的,不一定与配置文件的路径相关。

作为资源:

要包含资源,即在类路径中找到的文件,请使用 资源属性。

<include resource="includedConfig.xml"/>

作为网址:

要包含 URL 的内容,请使用 url 属性。


这里有一些关于如何实现它的提示。

注意配置文件之间的重复元素

我想警告您有关在 logback 配置文件之间不应重复的唯一元素,例如根元素。

您的实际配置很可能声明了根元素,因此您不应在新配置文件中再次指定它。
对于特定类或包的记录器元素也是如此:您不应将它们声明两次以避免在运行时出现意外行为。

哪些配置文件应包含其他文件

如果实际配置文件包含通用配置,而新配置文件包含特定配置,则将实际配置文件包含其他配置文件是有意义的。

拆分配置文件

如果您认为拥有多种配置可能有助于您拥有 更简洁的配置,不要犹豫将其拆分为多个文件:

...   
<include resource="other-logback-debug_product_a.xml"/>
<include resource="other-logback-debug_product_b.xml"/>
...

注意可加性

在包含的资源中,您可能应该为所有记录器指定false(默认为true)的可加性,因为我认为您不希望调试日志在祖先的附加器。

示例

包含的文件定义了一个名为FILE_DEBUG_KIOSK_PRODUCTRollingFileAppender
它还为com.product.kiosk.area 包定义了一个记录器,其日志级别为DEBUG,并将附加程序附加到它。
我从您发布的一个附加程序开始烹饪它(我删除了不相关的部分)。

配置文件包括:

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

includedConfFooLogback.xml,包含的配置文件:

<?xml version="1.0" encoding="UTF-8"?>

<included>

    <!-- Debug log -->
    <appender name="FILE_DEBUG_KIOSK_PRODUCT"
        class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${debug.kiosk.product.dir}/debug.log</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>${log.home}/${component-name}/${subcomponent-name}/debug.log.%i
            </fileNamePattern>
            <minIndex>1</minIndex>
            <maxIndex>10</maxIndex>
        </rollingPolicy>

        <triggeringPolicy
            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>20MB</maxFileSize>
        </triggeringPolicy>
        <encoder>
           <pattern>${default-log-pattern}</pattern>
        </encoder>
    </appender>

    <logger name="com.product.kiosk.area" level="DEBUG" additivity="false">
        <appender-ref ref="FILE_DEBUG_KIOSK_PRODUCT" />
    </logger>

</included>

【讨论】:

  • 不客气。如果你遇到一些有趣的事情,不要犹豫,反馈:)
  • 如何将日志级别设置为调试,给定这个设置?如果我不应该包含根元素?此外,包含中引用的文件需要在 中包含所有元素,对吗?似乎对我来说更好的方法是将新文件包含在现有的无法更改的文件中(这种更改可能是可能的)而不是相反,但我仍然不知道如何设置要调试的日志级别:/
  • 你能在你的问题中编辑你的实际配置吗?我会试着从它开始指导你。
  • 当你说“我想设置调试日志的目标是每个模块都有自己的 .log 文件等 -”你所说的模块是什么意思?你能说得更具体些吗?
  • com.product.vendor 之类的东西可以设置为与 com.product.kiosk.area 分开调试。我知道这需要具有显式日志级别设置的基本记录器定义。所以我想我需要从他们的文件中引用我的文件(反过来需要他们的文件内容在 内),然后如上所述设置我的记录器。听起来正确吗?
猜你喜欢
  • 2020-05-30
  • 2014-02-11
  • 1970-01-01
  • 2021-08-10
  • 2015-07-18
  • 2011-12-11
  • 2019-12-16
  • 2022-11-01
  • 1970-01-01
相关资源
最近更新 更多