簡體   English   中英

Logback - 你能從 env 變量中定義 appender 名稱和類嗎?

[英]Logback - can you define appender name and class from env variables?

我想要動態 logback appender 屬性,可以輕松地將其添加到 logback 配置文件中,但是嘗試設置 appender 的類和名稱(它們位於 xml 屬性中,而不是 appender 元素下的元素中)。

所以這是我的 application.yml(對示例的值進行硬編碼,但在實際用例中,在部署到 K8s 集群期間,這些值將作為來自 Helm 的環境變量傳遞):

log:
  config:
    appender:
      name: CONSOLE
      class: ch.qos.logback.core.ConsoleAppender

這是我嘗試訪問 logback-spring.xml(spring boot version - 2.2.4.RELEASE

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- use Spring default values like patterns -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- declaration of ENV properties:   -->
    <springProperty name="LOG_CONFIG_APPENDER_NAME" source="log.config.appender.name"/>
    <springProperty name="LOG_CONFIG_APPENDER_CLASS" source="log.config.appender.class"/>

    <appender name="${LOG_CONFIG_APPENDER_NAME}" class="${LOG_CONFIG_APPENDER_CLASS}">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="${LOG_CONFIG_APPENDER_NAME}"/>
    </root>
</configuration>

這會導致以下異常:

ERROR in ch.qos.logback.core.joran.action.AppenderAction - Could not create an Appender of type [${LOG_CONFIG_APPENDER_CLASS}]. ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type ${LOG_CONFIG_APPENDER_CLASS}

所以我的問題是:是否可以動態定義附加程序名稱和類?

對於本地環境,我想要簡單的控制台日志附加程序。 對於其他任何事情,我將使用LayoutWrappingEncoderJacksonJsonFormatter為我們的 ELK 堆棧添加自定義字段。

所以你想在你的logback-spring.xml使用<springProfile>標簽:

<springProfile>標記允許您根據活動的 Spring 配置文件選擇性地包含或排除配置部分。 <configuration>元素中的任何地方都支持<configuration>文件部分。 使用name屬性指定哪個配置文件接受配置。 <springProfile>標簽可以包含一個簡單的配置文件名稱(例如staging )或配置文件表達式。 配置文件表達式允許表達更復雜的配置文件邏輯,例如production & (eu-central | eu-west) 查看參考指南了解更多詳情。

請參閱下面的示例:

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

    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <springProfile name="staging">
        <!-- configuration to be enabled when the "staging" profile is active -->
    </springProfile>

    <springProfile name="dev | staging">
        <!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
    </springProfile>

    <springProfile name="!production">
        <!-- configuration to be enabled when the "production" profile is not active -->
    </springProfile>

</configuration>

我最終在 Groovy 中完成了這項工作,因為將配置映射到 Spring 配置文件對我和我的團隊不起作用,因為我們將開發配置文件用於本地和共享開發環境(托管在 K8s 集群上)。

我並不為此感到自豪,但以一個簡單的 if 結束了它:

def loggingType = System.getenv('LOGGING_TYPE')
def loggingLevelEnvVar = System.getenv('CUSTOM_LOGGING_LEVEL')
def loggingLevel = loggingLevelEnvVar == null ? INFO : Level.valueOf(loggingLevelEnvVar)
// please do not use a coloured pattern for consoles that will be scrapped
def loggingPattern = System.getenv('LOGGING_LEVEL_PATTERN')
...
if ('JSON'.equalsIgnoreCase(loggingType)) {
    appender('CONSOLE', ConsoleAppender) {
        encoder(LayoutWrappingEncoder) {
            layout(JsonLayout) {
                timestampFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
                timestampFormatTimezoneId = 'Etc/UTC'
                appendLineSeparator = true
                jsonFormatter(JacksonJsonFormatter) {
                    prettyPrint = false
                }
            }
        }
    }
} else {
    appender('CONSOLE', ConsoleAppender) {
        encoder(PatternLayoutEncoder) {
            pattern = loggingPattern
        }
    }
}
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM