Как я могу динамически (переменной env) активировать/деактивировать logback или logback appender?

есть ли способ выбрать, хочу ли я иметь добавление журнала или нет, через переменную среды?

У меня есть докеризированный микросервис 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?


person m1well    schedule 05.11.2018    source источник


Ответы (2)


В вашем 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, я думаю, что это может быть ваш единственный вариант.

person glytching    schedule 05.11.2018
comment
хорошая мысль, но тоже не сработала. приложение устанавливает приложения при запуске: 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 - person m1well; 05.11.2018
comment
В этом случае поместите весь присоединитель (и корневую ссылку) внутрь блока <if>. - person glytching; 05.11.2018

Вы можете установить переменную среды, такую ​​как LOGSTASH_ENABLED, и активировать это приложение только в том случае, если оно истинно.

В 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
person Rem    schedule 24.05.2020