如何 select 基于 属性 文件或环境变量的 Logback appender

How to select Logback appender based on property file or environment variable

我已经为 spring 引导项目配置了 logback xml。

我想在属性配置的基础上再配置一个appender。我们想为 JSON 日志或文本日志创建一个附加程序,这将由 属性 文件或环境变量决定。

所以我正在考虑执行此操作的最佳方法。

所以我想知道是否可以在运行时添加appender。它会在 spring 启动之前添加还是可以在项目中随时完成。

包含此场景的最佳方法是什么。

由于您已经在使用 Spring,我建议使用 Spring Profiles, lot cleaner than trying to do the same programmatically. This approach is also outlined in Spring Boot docs

您可以从任一 属性 文件设置活动配置文件:

spring.profiles.active=jsonlogs

或来自环境值:

spring_profiles_active=jsonlogs

来自启动参数的:

-Dspring.profiles.active=jsonlogs

然后每个配置文件都有单独的配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appender name="stdout-classic" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
          <pattern>%d{dd-MM-yyyy HH:mm:ss.SSS} %magenta([%thread]) %highlight(%-5level) %logger{36}.%M - %msg%n</pattern>
      </encoder>
  </appender>
  <appender name="stdout-json" class="ch.qos.logback.core.ConsoleAppender">
      <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
          <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
              <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat>
              <timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId>
              <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
                  <prettyPrint>true</prettyPrint>
              </jsonFormatter>
          </layout>
      </encoder>
  </appender>
  <!-- begin profile-specific stuff -->
    <springProfile name="jsonlogs">
        <root level="info">
            <appender-ref ref="stdout-json" />
        </root>
    </springProfile>
    <springProfile name="classiclogs">
        <root level="info">
            <appender-ref ref="stdout-classic" />
        </root>
    </springProfile>
</configuration>

正如前面的答案所述,您可以根据 Spring 配置文件设置不同的附加程序。

但是,如果您不想依赖该功能,可以使用 Logback manual 中描述的环境变量。即:

<appender name="json" class="ch.qos.logback.core.ConsoleAppender">
  <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
    <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
      <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
        <prettyPrint>true</prettyPrint>
      </jsonFormatter>
      <appendLineSeparator>true</appendLineSeparator>
    </layout>
  </encoder>
</appender>

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
    <pattern>
      %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n
    </pattern>
  </encoder>
</appender>

<root level="info">
  <!--
   ! Use the content of the LOGBACK_APPENDER environment variable falling back
   ! to 'json' if it is not defined
   -->
  <appender-ref ref="${LOGBACK_APPENDER:-json}"/>
</root>