Приложение для ведения журнала Dropwizard GELF

Я использую этот пакет дополнений для dropwizard для регистрации сообщений на сервере Graylog: https://github.com/gini/dropwizard-gelf

Он работал из коробки, просто добавив его в pom.xml и настроив в config.yml моего сервера dropwizard. Отличный материал!

Единственная проблема заключается в том, что если мой сервер Graylog по какой-то причине недоступен во время запуска, GelfAppenderFactory выдает исключение RuntimeException, и мастер удаления завершает работу. Мой веб-сервер никогда не запускается только потому, что сервер регистрации недоступен. Нехорошо.

Любые идеи, как я могу обойти это? Мой текущий подход состоял бы в том, чтобы скопировать и вставить GelfAppenderFactory в мой собственный код и обернуть важную часть в блок try/catch. Это кажется довольно грубым... так что любая помощь очень ценится.


person craddack    schedule 18.03.2016    source источник
comment
Есть несколько вариантов. Вы можете перезаписать DefaultLogFactory и обработать это в методе configure. Вы можете перезаписать ConfigureCommand и обрабатывать его, когда он пытается создать журнал.   -  person pandaadb    schedule 18.03.2016
comment
Спасибо за быстрый ответ. Однако я надеялся обойти возню с внутренностями дропволшебника.   -  person craddack    schedule 18.03.2016
comment
В этом случае посмотрите на свой основной класс. В методе run теоретически вы могли бы обернуть все в массовую попытку поймать и проанализировать исключение.   -  person pandaadb    schedule 18.03.2016
comment
Создайте гибридный регистратор, который либо кэширует, либо использует что-то еще в случае исключения. Например. сделать делегат, один регистратор идет в файл, один регистратор в GELF. Если GELF выдает исключение, вы его перехватываете и используете другой регистратор. Так вы ничего не потеряете. Вы даже можете кэшировать операторы, которые не удалось отправить. Итак, при следующем событии журнала (возможно, с разумными таймерами) вы просто повторяете те, которые раньше не удались?   -  person pandaadb    schedule 18.03.2016
comment
Да, это лучшее решение. Я посмотрю на это. Возможно, мне также следует проверить другие адаптеры Graylog, такие как logstash-gelf   -  person craddack    schedule 21.03.2016
comment
@pandaadb: в данный момент я пытаюсь перезаписать DefaultLoggingFactory. Как заставить dropwizard использовать мой перезаписанный класс вместо DefaultLoggingFactory?   -  person craddack    schedule 24.03.2016
comment
Привет. Что я сделал, так это перезаписал в файле конфигурации setLoggingFactory и аннотировал его с помощью @JsonProperty(logging). в setLoggingFactory используйте свой тип, например для меня: public void setLoggingFactory(MyOwnDropWizardLoggingConfig factory). DW прочитает тип и проанализирует его соответствующим образом. Он должен расширять LoggingFactory. Он должен иметь конструктор с нулевым аргументом. Моя полная конфигурация: stackoverflow.com/questions/27483442/   -  person pandaadb    schedule 24.03.2016
comment
Хм... Должно быть, я что-то упускаю. Я получаю: Не удалось разобрать конфигурацию по адресу: logging; Проблема с десериализацией свойства 'logging' (ожидаемый тип: [простой тип, класс com.example.util.graylog.GracefulLoggingFactory]; фактический тип: io.dropwizard.logging.DefaultLoggingFactory), проблема: несоответствие типа аргумента (через цепочку ссылок: AppConfiguration[ протоколирование])   -  person craddack    schedule 24.03.2016
comment
Я работаю с Dropwizard 0.9.1, кстати. Теперь LoggingFactory — это интерфейс, поэтому я расширяю DefaultLoggingFactory.   -  person craddack    schedule 24.03.2016
comment
Это помогло? Кроме того, в этой ссылке выше также есть пример того, как добавить совершенно новый тип в DW и сделать его доступным для него. Таким образом, вместо ведения журнала вы можете иметь полностью настраиваемый тип. Ах да, и я работал над 0.8.4 в то время   -  person pandaadb    schedule 24.03.2016


Ответы (2)


Это была конфигурация, которую я использовал в своем приложении:

в run(Configuration cofing, Environment env) методе

// GELF Configuration
GelfAppenderFactory gelfAppenderFactory = (GelfAppenderFactory) Iterables.find(configuration.getLoggingFactory().getAppenders(), new Predicate<AppenderFactory>() {
    @Override
    public boolean apply(AppenderFactory input) {
        return input instanceof GelfAppenderFactory;
    }
}, null);

if (gelfAppenderFactory != null) {
    GelfBootstrap.bootstrap(getName(), gelfAppenderFactory.getHost(), gelfAppenderFactory.getPort(), false);
    Thread.currentThread().setUncaughtExceptionHandler(UncaughtExceptionHandlers.systemExit());
}// End GELF configuration

в файле .yaml

logging:
  level: INFO
   appenders:
     - type: console
     - type: gelf
         host: graylog2
         includeFullMDC: true
person Vish Vaka    schedule 20.03.2016
comment
Спасибо. К сожалению, это не решает мою проблему, потому что GelfAppender, настроенный в YML, выдает исключение времени выполнения до выполнения run (в случае, если сервер регистрации недоступен) - person craddack; 21.03.2016

Чтобы достичь того, чего я хотел, я отказался от попыток использовать dropwizard-gelf. Что, вероятно, в любом случае является хорошей идеей, потому что он использует устаревшую версию снятого с производства плагина (https://github.com/Moocar/logback-gelf).

Вместо этого я сбросил конфигурацию ведения журнала dropwizard и вернулся к загрузке файла logback.xml из пути к классам следующим образом:

void reset() {
  ILoggerFactory factory = LoggerFactory.getILoggerFactory();
  LoggerContext context = (LoggerContext)factory;
  context.reset();
  ContextInitializer initializer = new ContextInitializer(context);
  initializer.autoConfig();
}

К сожалению, Dropwizard не предоставляет какого-либо стандартного способа повторного включения стандартных способов Logback (см. https://github.com/dropwizard/dropwizard/pull/567)

Однако теперь я могу использовать (активно разрабатываемый) плагин logstash-gelf (https://github.com/mp911de/logstash-gelf) с конфигурацией Logback.

Спасибо @pandaadb за вашу помощь. В конце концов, копаться во внутренней работе Dropwizard было для меня слишком хлопотно.

person craddack    schedule 24.03.2016