使用 Dropwizard 在不同文件中记录不同级别

Log different levels in different files using Dropwizard

该问题与 - How to configure log4j to log different log levels to different files for the same logger 下所述的问题类似。我可以在这里找到的现有问题主要是处理 logback 和 log4j 配置。在 Dropwizard 配置中专门寻找一些东西来解决这个问题。

曾尝试在互联网上四处寻找,似乎 LevelMatchFilter 可能适合使用,但无法弄清楚 Dropwizard 的相关文档。

我目前拥有的是

logging:
  level: INFO
  appenders:
    - type: file
      threshold: INFO
      logFormat: '%date{dd-MM-yyyy HH:mm:ss.SSS} %X{X-Request-Id} [%thread] %-5level %logger{36} - %msg%n'
      currentLogFilename: .../info.log
      archivedLogFilenamePattern: .../info-%i.log.gz
      archivedFileCount: 2
      timeZone: IST
      maxFileSize: 100MB

    - type: file
      threshold: WARN
      currentLogFilename: .../warn.log
      archivedLogFilenamePattern: .../warn-%i.log.gz
      ... other attributes

    - type: file
      threshold: ERROR
      ...similar attributes for error logs

但这导致 log.error 成为三个文件的一部分,我打算执行的是确保它只是 error.log 文件的一部分并且与其他文件相关。

Dropwizard 有自己的日志配置,它支持adding filters by writing FilterFactory classes

例如,这里有一个 FilterFactory,它过滤掉除 ERROR 级别日志事件之外的所有内容:

@JsonTypeName("error-only")
public class ErrorLogFilter implements FilterFactory<ILoggingEvent> {

    @Override
    public Filter<ILoggingEvent> build() {
        return new Filter<ILoggingEvent>() {
            @Override
            public FilterReply decide(ILoggingEvent event) {
                if (event.getLevel().equals(Level.ERROR)) {
                    return FilterReply.NEUTRAL;
                } else {
                    return FilterReply.DENY;
                }
            }
        };

    }
}

要注册工厂,其完全限定的类名必须列在 META-INF/services/io.dropwizard.logging.filter.FilterFactory 文件中。

让文件附加程序之一使用它的配置如下:

  - type: file
    threshold: ERROR
    logFormat: '%date{dd-MM-yyyy HH:mm:ss.SSS} %X{X-Request-Id} [%thread] %-5level %logger{36} - %msg%n'
    currentLogFilename: .../error.log
    archivedLogFilenamePattern: .../error-%i.log.gz
    archivedFileCount: 2
    timeZone: IST
    maxFileSize: 100MB
    filterFactories:
      - type: error-only