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 的内部工作原理对我来说太麻烦了。
我正在使用 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 的内部工作原理对我来说太麻烦了。