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

如何基于属性文件或环境变量选择日志返回追加器

云隐水
2023-03-14

我想根据配置的属性配置另一个追加器。我们希望为JSON日志或文本日志创建一个appender,这将由属性文件或环境变量决定。

所以我在考虑最好的方法来做到这一点。

  • 使用筛选器将日志打印到文件的1中(可以是JSON还是Txt)。但这将创建两个追加器。我只想创建1个appender。
  • 在logback XML文件中使用“If Else”块。如果在追加器周围使用if else的话,记录器看起来很邋遢,而且容易出错。所以会尽量避免。
  • 现在探究在运行时添加appender的选项。

所以我想知道是否有可能在运行时添加appender。它会在Spring靴子之前被添加吗?或者它可以在项目中的任何时候完成。

共有1个答案

柯树
2023-03-14

由于您已经在使用Spring,我建议使用Spring概要文件,这比尝试以编程方式做同样的事情要干净得多。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>
 类似资料:
  • 在我的应用程序的logback.xml中,我有一个AsyncAppender定义如下。 当我在Windows10上部署Tomcat中的war时。 null 请各位专家告诉我,我在这里做错了什么?AsyncAppender是否有其他属性可以帮助修复此行为?

  • 我想将有效负载架构添加到环境变量,以便我可以根据架构验证响应负载。 我的环境变量定义如下: 但是,我无法在我的邮递员测试代码中访问此环境变量。我尝试过通过以下方式访问它: 但是,这将返回null。如何访问使用postman创建的环境变量。我实现这一点的方式与http://blog.getpostman.com/2017/07/28/api-testing-tips-from-a-postman-p

  • 我正在spring boot中构建一个可重用的库,它可以调用Rest API并进行一些验证。这将构建为JAR,目标是通过添加pom将此库用作maven依赖项。其他spring boot项目中的xml。 问题是库如何知道要加载哪些环境属性。因为它没有在任何服务器上运行。例如:调用应用程序将包含为依赖项,并部署在dit环境中。我希望库能够获取dit属性,如url、令牌等,以及关于如何实现这一点的任何建

  • 我有一个java应用程序,它有三个“形上说”的对象。。。1类动物,1类食物,这些与任何遗传或接口无关。。班级经理的最后一个任务是列出动物和食物的清单,经理负责动物园里的动物和食物。。 说到点子上。。。 我正在使用log4j,我需要登录到一个txt文件,如果并且仅当动物列表中的某些内容发生变化。。。(动物死了,出生了,或者什么的…)我需要登录系统。当且仅当食物清单中的某些东西发生变化时。。。(需要新

  • 问题内容: 我们使用spring 3.1的新环境配置文件功能。当前,我们通过在将应用程序部署到的服务器上设置环境变量spring.profiles.active = xxxxx来设置活动配置文件。 我们认为这是次优的解决方案,因为我们要部署的war文件应该只具有一个附加的属性文件,该文件设置了应加载spring应用上下文的环境,因此部署不依赖于服务器上设置的某些环境变量。 我试图弄清楚该怎么做,发

  • > 如何以编程方式从log4j2中的记录器中删除appender?-即使我删除appender,它仍然发送日志 如何根据java系统属性有条件地添加log4j2附加器?-appender忽略通过:export log_level=off从命令行传递变量,并始终使用默认值,在本例中均为如此。脚本解决方案也有同样的问题 -level属性不接受动态值,并引发无法将“${sys:loglevel}”强制转