gpt4 book ai didi

java - 有没有办法从每个日志级别的两个单独的 logback.xml 文件配置 logback?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:22:15 24 4
gpt4 key购买 nike

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

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

编辑以添加示例文件:

主要/不可更改的 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" />

最佳答案

您可以使用 Logback fileInclusion 机制。

来自documentation :

Joran supports including parts of a configuration file from another file. This is done by declaring a element.

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

The contents to include can be referenced as a file, as a resource, or as a URL.

作为文件:要包含文件,请使用文件属性。可以使用相对路径,但注意当前目录是由应用程序定义的,与配置文件的路径没有必然关系。

作为资源:

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

<include resource="includedConfig.xml"/>

作为 URL:

要包含 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 并将附加程序附加到它。
我从您发布的一个附加程序开始对其进行了 cooking (我删除了不相关的部分)。

配置文件包含:

<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>

关于java - 有没有办法从每个日志级别的两个单独的 logback.xml 文件配置 logback?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41442673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com