【问题标题】:How can I dynamically (by env variable) activate/deactivate logback or logback appender?如何动态(通过 env 变量)激活/停用 logback 或 logback appender?
【发布时间】:2018-11-05 10:25:04
【问题描述】:

有没有办法通过环境变量来选择是否要使用 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} 我可以用我的 prometheus 指标来做到这一点吗?

【问题讨论】:

  • 不,问题不是,应用程序找不到 Logstash 的主机。问题是,我只想启动应用程序,没有ELK堆栈(所以没有logstash的主机^^)

标签: spring-boot logging docker-compose logback elastic-stack


【解决方案1】:

在您的 logback.xml 中,当存在命名的 JVM 参数时,您可以使用 &lt;if&gt; 构造来启用 SYSLOG 附加程序。

在以下示例中,如果您使用 -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 附加程序被实例化,我认为这可能是您唯一的选择。

【讨论】:

  • 好点,但也没有用。应用程序在启动时将附加程序实例化:app | 11:53:12,409 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.classic.net.SyslogAppender] app | 11:53:12,441 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [SYSLOG] app | 11:53:12,462 |-ERROR in ch.qos.logback.classic.net.SyslogAppender[SYSLOG] - Could not create SyslogWriter java.net.UnknownHostException: logstash: Name or service not known
  • 在这种情况下,将整个 appender(和根引用)放在 &lt;if&gt; 块中。
【解决方案2】:

您可以设置一个环境变量,例如 LOGSTASH_ENABLED,并且只有在它为 true 时才激活该附加程序。

logback-spring.xml 中:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <springProperty name="logHost" source="appname.logstash.host" />
  <springProperty name="logstashEnabled" source="appname.logstash.enabled" />

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>
        %green(%d{yyyy-MM-dd HH:mm:ss}) %magenta([%thread]) %blue(%-5level) %yellow(%logger{36}) - %msg%n
      </Pattern>
    </layout>

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

  <if condition='${logstashEnabled} == true'>
    <then>

      <appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>${logHost}</destination>
        <!-- encoder is required -->
        <encoder class="net.logstash.logback.encoder.LogstashEncoder" />
        <keepAliveDuration>5 minutes</keepAliveDuration>
      </appender>

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

    </then>
  </if>

</configuration>

docker-compose.yml 中:

environment:
  LOGSTASH_HOST: logstash:5000
  LOGSTASH_ENABLED: "true"

bootstrap.yml 中:

appname:
  logstash:
    host: ${LOGSTASH_HOST:localhost:5000}
    enabled: ${LOGSTASH_ENABLED:false} # default, when not using docker-compose set to false

【讨论】:

    猜你喜欢
    • 2022-07-26
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    相关资源
    最近更新 更多