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

如何动态地(通过env变量)激活/停用logback或logback appender?

濮波
2023-03-14

是否有一种方法可以通过环境变量来选择是否有一个logback appender?

我有一个dockerized spring boot微服务,现在添加了ELK堆栈。
到目前为止工作得很好。
但是现在如果我想在没有ELK堆栈的情况下启动服务,应用程序会抛出一个错误,即它不知道logstash的主机:

app | 10:09:23,537 |-ERROR in ch.qos.logback.classic.net.SyslogAppender[SYSLOG] - Could not create SyslogWriter java.net.UnknownHostException: logstash: Name or service not known
app |   at java.net.UnknownHostException: logstash: Name or service not known

下面是我的logback.xml文件:

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

    <appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
        <syslogHost>logstash</syslogHost>
        <port>5000</port>
        <facility>LOCAL1</facility>
        <suffixPattern>[%thread] %logger %msg</suffixPattern>
    </appender>

    <root level="INFO">
        <appender-ref ref="SYSLOG"/>
    </root>

</configuration>

我知道这是一个非常简单的版本,但我对使用logback/elk堆栈进行日志记录是新手。

那么,有没有一种方法可以像使用我的普罗米修斯度量标准一样,在yaml文件中注入环境变量,例如active=${logback_active:false}

共有1个答案

汝吕恭
2023-03-14

在logback.xml中,可以使用 构造来在出现命名JVM参数时启用syslogappender。

在下面的示例中,如果使用-dsyslog运行应用程序,则将使用syslogappender,否则将忽略它,并使用默认appenderconsole:

<if condition='isDefined("syslog")'>
  <then>
    <appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
      ...
    </appender>

    <root level="INFO">
      <appender-ref ref="SYSLOG" />
    </root>
  </then>
  <else>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
      ...
    </appender>

    <root level="INFO">
      <appender-ref ref="CONSOLE" />
    </root>
  </else>
</if>

这需要对root声明进行一些复制,但由于需要有条件地防止SYSLOG appender被实例化,我认为这可能是唯一的选择。

 类似资料:
  • 问题内容: 我希望运行一个简单的Shell脚本来简化某些conda环境的管理。在os中通过os激活conda环境在shell中工作正常,但在shell脚本中却存在问题。有人可以指出为什么发生这种情况的正确方向吗? 重复该问题的示例: 问题答案: 错误消息很有帮助-告诉您在运行脚本的子外壳中未正确设置conda。要在脚本中使用conda,您将需要(如错误消息所述)运行(或您的外壳是什么)首先。con

  • 问题内容: 我试图使用临时表开发此存储过程,但是那行不通,所以我改用表变量。我需要对表变量执行临时动态查询,然后使用该表变量执行最终查询。问题是我收到错误消息“必须声明标量变量@clms”。我假设Exec没有该表变量的作用域? 问题答案: 这是简单的最小示例。您可以使用语句。关键是要在动态查询的内部和外部声明表变量。在动态查询结束时,只需从表变量中选择并将结果集插入外部表变量中即可:

  • 问题内容: 我写了一个python程序。如果我有一个像这样的shebang: 然后使用以下命令使文件可执行: 我可以这样运行程序: 这是问题。我使用conda虚拟环境。当我运行上述程序时,系统会创建一个无法识别活动环境的子外壳: 但是如果我这样做的话… 如何指定在子Shell中使用的正确环境?可能吗?我希望省去输入六个字符串的麻烦。 另一篇文章,在conda托管环境中的Shebangs,简短地谈到

  • 问题内容: 我想通过Python中的while循环动态创建变量。 问题答案: 可以使用字典来完成此任务。字典是键和值的存储。 你可以使用变量键名来获得变量变量的效果,而不会带来安全风险。 对于你正在考虑做类似事情的情况 … 列表可能比字典更合适。一个列表代表对象的有序序列,并带有整数索引: 对于有序序列,列表比整数键类型的字典更方便,因为列表支持迭代的索引顺序,,和其他操作,将需要尴尬密钥管理与字

  • 我想记录SpringBoot 2.7.0中的所有SQL语句https://www.baeldung.com/sql-logging-spring-boot#2-通过记录器,通过以下属性完成: 只要我使用-File,这就可以正常工作。但是我必须通过OpenShift中的环境变量来设置它。 令人不快的是,文档 https://github.com/spring-projects/spring-boot

  • 当满足某些条件时,如遇到特殊类型的元组,我希望停用拓扑。这可以在喷口/螺栓中完成吗?如果是,是否也有办法从喷口/螺栓重新激活拓扑?