当前位置: 首页 > 知识库问答 >
问题:

Dropwizard 0.9.1:在自定义AppenderFactory实现中使用应用程序配置值

秋光熙
2023-03-14

我正在基于Dropwizard v0.9.1构建一个web堆栈。堆栈中的所有日志都通过AppenderFactory接口的自定义实现发送到Loggly:

@JsonTypeName("loggly")
public class LogglyAppenderFactory extends AbstractAppenderFactory {
    @JsonProperty
    private String token;

    @JsonProperty
    private final Optional<String> tag = Optional.absent();

    @Override
    public Appender<ILoggingEvent> build(LoggerContext context, String applicationName, Layout<ILoggingEvent> layout) {
        ...
    }

    protected Layout<ILoggingEvent> buildLayout(LoggerContext context) {
        ...
    }
}

此类未在我的应用程序类中的环境中注册。相反,它似乎是Dropwizard基于@JsonTypeName注释自动连接的。尽管如此,tokentag字段由出现在我的配置yaml文件中的值填充:

logging:
    level: INFO
    appenders:
        # send logs to loggly
        - type: loggly
          threshold: INFO
          token: "my-secret-loggly-token"
          tag: "webservice-ci"

问题是,这些配置值不会出现在应用程序的配置类中,这意味着在构建其他资源或运行状况检查时,我无法重用它们。

理想情况下,我希望手动注册<code>LogglyAppenderFactory

 public class WebServiceApplication extends Application<WebServiceAppConfiguration> {
    @Override
    public void run(WebServiceAppConfiguration configuration, Environment environment) throws Exception {
        final HttpClient httpClient = new HttpClientBuilder(environment).using(configuration.getHttpClientConfiguration()).build("httpClient");

        // to be clear, environment.logAppenders() doesn't exist, and this doesn't work
        final LogglyAppenderFactory logglyAppenderFactory = new LogglyAppenderFactoryBuilder(configuration).build();
        environment.logAppenders().register(logglyAppenderFactory)

        // when we make this HealthCheck, it would be cool to reference the same config values that the AppenderFactory used
        final LogglyHealthCheck logglyHealthCheck = new LogglyHealthCheck(httpClient, configuration);
        environment.healthChecks().register("Loggly", logglyHealthCheck);
    }
}

以便LoggleAppenderFactory和LoggleHealthCheck都可以使用相同的配置值来指示它们如何与外部服务通信。

我怀疑,如果我引入一个依赖注入框架,如Google Guice,并使用它将应用程序配置注入到两个对象中,这可能是可能的,但另一方面,由于logback appender通常是在应用程序生命周期的早期创建的,我不知道Guice是否会在创建AppenderFactory时准备就绪。

有人知道怎么做吗?如果不是,我是否要将令牌放入配置文件两次?在<code>日志记录中执行一次。附录部分,以及LogglyHealthCheck可以访问的其他部分?

共有2个答案

东方吕恭
2023-03-14

事实证明,配置类公开了一个包含日志配置的LoggingFactory。我将这个助手方法添加到我的配置类中,该类从自定义AppenderFactory中提取我关心的字段:

/**
 * Extracts the Loggly token from the logging.appenders section of the configuration file.
 * If a {@link LogglyAppenderFactory} is not specified as one of the log appenders, this method returns null.
 * @return the Loggly token or null if no token is specified
 */
public String getLogglyToken() {
    final DefaultLoggingFactory loggingFactory = (DefaultLoggingFactory) getLoggingFactory();
    for (final AppenderFactory appenderFactory : loggingFactory.getAppenders()) {
        if (appenderFactory instanceof LogglyAppenderFactory) {
            final LogglyAppenderFactory logglyAppenderFactory = (LogglyAppenderFactory) appenderFactory;
            return logglyAppenderFactory.getToken();
        }
    }
    return null;
}

它不漂亮,但它有效!

宗政功
2023-03-14

我想你在找

configuration.getLoggingFactory();

此API为您提供配置文件中的所有日志配置。

如。

configuration.getLoggingFactory().getLevel();

configuration.getLoggingFactory().getAppenders()

((ConsoleAppenderFactory)configuration.getLoggingFactory().getAppenders().get(0)).getLogFormat();

不是最漂亮的API,但它应该工作

 类似资料:
  • 问题内容: 主要问题-可能吗?我没有运气就尝试了.. 主app.js 提供者本身 而且我有这样的错误: 有任何想法吗? 谢谢! 问题答案: 您 不能 将服务注入提供者配置部分。 您 CAN 注入服务成初始化提供者的服务的部分。 细节: Angular框架有两个阶段的初始化过程: 阶段1:配置 在此阶段,将初始化所有提供程序,并执行所有部分。这些部分可能包含配置提供程序对象的代码,因此可以将它们与提

  • 然后我的看起来像 我的问题是为空。知道怎么了吗?另外,我可以绑定我的注入器的实例而不是绑定类吗?这样,我就可以构造将数据作为参数传递的实例。

  • 问题内容: 对我先前的问题采取了后续行动。我正在尝试使用JSR-330标准注释和jersey捆绑的HK2框架注入应用程序配置数据。 理想情况下,我想为注释创建一个自定义,该自定义将在或对象中查找所需的值,该值将从其他地方读取的数据中填充。在我的第一次尝试中,我创建了一个实例,例如 然后我的模样 我的问题是那是空的。知道有什么问题吗?另外,我可以绑定我的Injector实例而不是绑定类吗?这样,我可

  • 编辑: 我的理解可能是错误的,但这是一个不同于以编程方式设置语言环境的问题,因为我已经实现了那里建议的答案,我仍然有一些问题。 在这个问题中,我请求帮助解决这些问题(在设置的语言环境中没有参考的问题)。 原始帖子 我试图在我的应用程序中实现自定义语言环境,并遇到几个问题。 在调用setContentView之前,我在所有活动中使用以下代码: 编辑: 我还测试了它与: 我添加到Android中的所有

  • 问题是,就应用程序生命周期处理和易于使用而言,这种体系结构是否可以被认为是安全的? Update:每次创建新的活动并希望获得数据时,它可以获得ApplicationContext的BehaviorSubject,然后订阅它,Subject将发出最后发出的值;我为什么要这样做?例如。假设你有新闻项目,你获取了新闻提要,你想启动后台任务来获取新闻项目的全部内容,在这种情况下,我可以在你滚动新闻列表时开

  • 我正在努力弄清楚我为React应用程序配置Firebase的尝试出了什么问题。我已经遵循了至少10个不同的教程,但无法让配置变量注册为已识别的。 然后,我有一个firebase/firebase.js文件,如下所示: 我一直试图弄清楚为什么配置变量被记录为未定义。 有没有人知道如何成功配置一个firebase应用程序。我之前关于这个主题的问题建议删除env.development文件中的:和值之间