0

我正在为 dropwizard 使用这个插件包将消息记录到 Graylog 服务器: https ://github.com/gini/dropwizard-gelf

它开箱即用,只需将其添加到 pom.xml 并在我的 dropwizard 服务器的 config.yml 中配置它。好东西!

唯一的问题是,如果我的 Graylog 服务器在启动过程中由于某种原因不可用,GelfAppenderFactory 会抛出 RuntimeException 并且 dropwizard 退出。我的网络服务器永远不会因为日志服务器不可用而启动。不好。

有什么想法可以绕过它吗?我目前的方法是将 GelfAppenderFactory 复制并粘贴到我自己的代码中,并将关键部分包装在 try/catch 块中。这感觉相当粗糙......所以非常感谢任何帮助。

4

2 回答 2

0

这是我在应用程序中使用的配置:

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
于 2016-03-20T17:09:56.207 回答
0

为了实现我想要的,我放弃了尝试使用 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

但是,现在我可以通过 Logback 配置自由使用(积极开发的)插件 logstash-gelf ( https://github.com/mp911de/logstash-gelf )。

感谢@pandaadb 的所有帮助。最后,深入研究 Dropwizard 的内部工作对我来说太麻烦了。

于 2016-03-24T16:55:11.113 回答