Поделитесь одной и той же настройкой кодировщика для разных приложений в logback xml

У меня есть кодировщик, использующий net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder для настройки содержимого журнала с помощью набора поставщиков акций, шаблонов и пользовательских поставщиков. То же самое должно использоваться в разных приложениях, например. консоль, файл, скользящий файл и пользовательский для модульного тестирования. Я не хочу повторять одну и ту же конфигурацию в каждом приложении, поскольку она точно такая же, поэтому мне интересно, есть ли способ поделиться ею между разными приложениями?

e.g.

<configuration>
  <appender name="FILE_LOG" class="ch.qos.logback.core.FileAppender">
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
      ... configuration can be shared ...
    </encoder>
  </appender>
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
      ... repeated the exact same configuration ...
    </encoder>
  </appender>

Я знаю, что есть эта функция «включения», но кажется, что для включения она должна начинаться с корневого уровня (т.е. appender). Есть ли способ «включить» на уровне encoder?


person user1589188    schedule 16.10.2019    source источник


Ответы (1)


К сожалению, logback не позволяет полностью использовать конфигурацию кодировщика в файлах конфигурации xml.

Вместо этого вы могли бы

  1. определить класс, который расширяет net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder,
  2. выполнить программную настройку внутри этого класса, а затем
  3. ссылайтесь на свой класс в xml.

Например:

public class JsonEncoder extends LoggingEventCompositeJsonEncoder {
    public JsonEncoder() {
    }
    @Override
    public void start() {
        // Note: you can access logback properties via getContext().getProperty(...)

        JsonProviders<ILoggingEvent> providers = getProviders();
        providers.addProvider(new LoggingEventFormattedTimestampJsonProvider());
        providers.addProvider(new LogLevelJsonProvider());
        providers.addProvider(new MessageJsonProvider());
        providers.addProvider(new ThreadNameJsonProvider());
        providers.addProvider(new LoggerNameJsonProvider());
        providers.addProvider(new MdcJsonProvider());
        providers.addProvider(new LogstashMarkersJsonProvider());
        providers.addProvider(new StackTraceJsonProvider());
        providers.addProvider(new ArgumentsJsonProvider());
        super.start();
    }
}
<configuration>
  <appender name="FILE_LOG" class="ch.qos.logback.core.FileAppender">
    <encoder class="your.package.JsonEncoder"/>
  </appender>
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="your.package.JsonEncoder"/>
  </appender>

Вы также можете отказаться от logback.xml и перейти к полной программной конфигурации, где вы будете использовать фабричный метод для создания каждого кодировщика. Обратите внимание, что для каждого приложения необходимы отдельные экземпляры кодировщика, но вы можете сконструировать каждый экземпляр кодировщика одинаково.

Кроме того, я не пробовал это лично, но вы можете использовать конфигурацию Groovy, чтобы поделиться конфигурацией кодировщика, но для этого, к сожалению, необходимо добавить groovy в путь к классам.

person Phil Clay    schedule 16.10.2019
comment
Да спасибо. Я думаю, вы правы, но хотелось бы немного подождать и посмотреть, есть ли другой ответ (например, использование упомянутого вами groovy) от других, прежде чем согласиться с тем, что нет способа сделать это в чистом xml в качестве ответа. Кроме того, выполнение этого в программе теряет легкость изменения конфигурации. Но спасибо вам за ваши усилия, чтобы показать эту возможность всем, респект. - person user1589188; 16.10.2019