Как записывать журналы с разными уровнями журнала в разные файлы в Dropwizard?

#logging #logback #slf4j #dropwizard

#ведение журнала #обратный вход #slf4j #dropwizard

Вопрос:

Итак, в основном, что я хочу сделать, это записывать журналы с разными уровнями журналов, такими как INFO DEBUG WARN и т.д., В разные файлы журнала.

Я нашел что-то похожее для slf4j здесь, но dropwizard использует logback в качестве основы ведения журнала.

Кто-нибудь может сказать мне, как это сделать в dropwizard с обратным журналом? Какие изменения я должен внести в свой файл conifg.yml?

  level: INFO
  loggers:
    "io.dropwizard": INFO
    "org.hibernate.SQL":
      level: DEBUG
      additive: false
      appenders:
        - type: file
          currentLogFilename: /var/log/myapplication-sql.log
          archivedLogFilenamePattern: /var/log/myapplication-sql-%d.log.gz
          archivedFileCount: 5
  

Ответ №1:

Вот что вам нужно сделать:

  1. Внедрите или найдите какой-либо существующий код для пользовательского фильтра обратного входа.
    Вот пример фильтра, который пропускает только сообщения ERROR уровня:
 package foo;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.dropwizard.logging.filter.FilterFactory;

@JsonTypeName("errors-only")
public class ErrorsOnlyFilterFactory implements FilterFactory<ILoggingEvent> {
    @Override
    public Filter<ILoggingEvent> build() {
        return new Filter<>() {
            @Override
            public FilterReply decide(ILoggingEvent event) {
                return event.getLevel() == Level.ERROR ?
                        FilterReply.ACCEPT :
                        FilterReply.DENY;
            }
        };
    }
}
  
  1. Создать файл
    <resources>/META-INF/services/io.dropwizard.logging.filter.FilterFactory
    и заполните его именем класса фильтра. В моем примере файл содержит только одну строку:
 foo.ErrorsOnlyFilterFactory
  
  1. Добавьте значение @JsonTypeName аннотации в appender config в разделе filterFactories/type (примечание: type это массив, поэтому при необходимости вы можете указать несколько фильтров для каждого приложения):
 logging:
  appenders:
    - type: file
      currentLogFilename: errors.log
      ...
      filterFactories:
        - type: errors-only
  

Для каждого уровня ведения журнала, который вы хотите регистрировать отдельно, вы должны:

  • создайте новый класс фильтра
  • добавить новую строку в META-INF/services/io.dropwizard.logging.filter.FilterFactory
  • добавить новую конфигурацию приложения