当前位置: 首页 > 知识库问答 >
问题:

Logback-你能从env变量定义appender名称和类吗?

韩寒
2023-03-14

我希望有动态的logback appender属性,可以很容易地添加到logback配置文件中,但是试图设置appender的类和名称(它们在xml属性中,而不是appender元素下的元素中)。

以下是我的application.yml(为示例硬编码了值,但在实际用例中,在部署到K8s集群期间,这些值将作为env变量从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}

共有1个答案

嵇浩淼
2023-03-14

对于本地环境,我想有一个简单的控制台日志appender。对于其他内容,我将使用LayoutRappingEncoderJacksonJsonFormatter为我们的ELK堆栈添加自定义字段。

因此,您希望在logback-spring.xml中使用 标记:

标记允许您根据活动的Spring概要文件包括或排除配置部分。 元素中的任何位置都支持配置文件节。使用name属性指定哪个配置文件接受配置。 标记可以包含简单的概要文件名(例如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>
 类似资料:
  • 是否有一种方法可以通过环境变量来选择是否有一个logback appender? 我有一个dockerized spring boot微服务,现在添加了ELK堆栈。 到目前为止工作得很好。 但是现在如果我想在没有ELK堆栈的情况下启动服务,应用程序会抛出一个错误,即它不知道logstash的主机: 下面是我的logback.xml文件: 我知道这是一个非常简单的版本,但我对使用logback/el

  • 在为Logback appender指定实现类时,是否可以使用变量替换?例如, 如上所述指定时,Logback似乎试图加载名称为“${LOGFILE_APPENDER_CLASS}”的类。也就是说,不执行变量替换! 我想将输出发送到eclipse开发人员的生产和控制台中的文件。如果可能的话,我不想重复appender配置,因为它包含了一长串过滤器,在大多数情况下都是相同的。

  • 我对使用Spring、SLF4J和logback是新手。我试图实现一个自定义数据库追加器,它将只记录Spring批处理期间数据库的特定类型的异常。 到目前为止,我已经开始在spring中设置一个扩展AppenderBase类的Logback Database Appender,然后设置一个扩展InitializingBean的初始化器,以便在spring初始化后将Appender添加到根记录器(这

  • 我知道Cucumber可以在给定的步骤定义中定义实例变量。此实例变量成为

  • 如何配置 比如要 # OS X, Linux $ PORT=3000 umi dev # Windows (cmd.exe) $ set PORT=3000&&umi dev # Or use cross-env for all platforms $ yarn add cross-env --dev $ cross-env PORT=3000 umi dev # .env $ echo P

  • 问题内容: 我需要使用可以通过循环轻松获得的命名模式来创建大量对象。有什么办法可以像这样从变量中读取对象名称? 我不需要为对象分配变量名,仅是在分配时从其获取名称。 问题答案: 您所选择的单词表明您不完全了解变量和对象的工作方式,因此您需要对其进行修复以使其在Java中得到广泛应用。 如果我写: 我创建一个新对象, 然后 定义一个指向该对象的变量。 该对象 没有名称 (它具有一个ID,该ID是在运