Dropwizard GELF 日志记录附加程序

Dropwizard GELF logging appender

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

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

唯一的问题是,如果我的 Graylog 服务器由于某种原因在启动期间不可用,GelfAppenderFactory 会抛出 RuntimeException 并退出 dropwizard。我的网络服务器从未启动,只是因为日志服务器不可用。不好。

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

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

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

为了达到我想要的效果,我放弃了尝试使用 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 的内部工作原理对我来说太麻烦了。