使用 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
该问题与 - 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