如何动态(通过环境变量)激活/停用 logback 或 logback 附加程序?

2024-03-25

有没有办法通过环境变量选择是否有 logback 附加程序?

我有一个 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}就像我可以用我的普罗米修斯指标来做到这一点?


在你的 logback.xml 中你可以使用<if>构建以启用SYSLOG当存在命名 JVM 参数时附加程序。

在下面的示例中,如果您运行应用程序-Dsyslog那么你的SYSLOG附加器将被使用,否则它将被忽略并且默认附加器,CONSOLE,将参与:

<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 附加程序被实例化我想这可能是你唯一的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何动态(通过环境变量)激活/停用 logback 或 logback 附加程序? 的相关文章

随机推荐