具有多个附加程序的文件名中的 Dropwizard 日志记录实例

Dropwizard logging instance in filename with multiple appenders

这是使用带有 Yaml 文件和一些 java 的 Dropwizard 日志记录。

我想在 Dropwizard 文件名中添加一个实例字段,以便日志可以处理多个实例。这并不太难。我构建了一个 FileAppenderFactory,在 buildAppender 上,我只是获取 CurrentLogFilename(),修改实例编号,然后设置它。存档名称同上。一切都很好。

问题是当我想添加第二个文件附加程序(用于指标)时。

所以之前我有

logging:
  loggers:
    // etc etc
  appenders:
    - type: file
    // etc etc

现在我有:

logging:
  loggers:
    // etc etc
    my.metrics.logger:
      additive: false
      //etc etc
      appenders:
      - type: file
      // etc etc -- I can't modify this name
  appenders:
    - type: file
    // etc etc -- I see this name when it's built!

我原以为 FileAppenderFactory 会被调用两次(一次用于所有记录器的附加器,一次用于度量的非附加附加器),但它仍然只被调用一次,所以我不能拦截要修复的指标文件的名称。

我查看了日志上下文,我可以转到上下文 --> loggerCache --> my.metrics.logger --> aai --> appenderList (AsyncAppender) --> aai --> appenderList ( RollingFileAppender) 并修复该文件名(和滚动策略),假设我可以访问它,但这是一个大问题。

有什么我想念的吗?如果只调用一次 MyFileAppenderFactory 的构建方法,如何创建多个文件附加程序。

更新——我确实看到另一个是通过默认的 FileAppenderFactory 构建的,但我不知道为什么当我将“文件”映射到 [=31= 时它会通过默认的 FileAppenderFactory ] ....再次为另一个appender工作。

答案很复杂。

对于附加附加器(上图),用于执行此操作的 ObjectMapper 是在 DiscoverableSubtypeResolver 中创建的,而不是在基本反序列化器中创建的。因此,您不能以编程方式注册您的工厂,而必须将其添加到 META-INF\services\io.dropwizard.logging.AppenderFactory 文件(您需要从 dropwizard jar 中复制该文件,然后添加您的工厂)。

这至少会让你的工厂受到打击(尽管你可能会遇到其他的 dropwizard 问题,但它们超出了这个问题的范围)。