Dropwizard日志记录:为特定记录器添加新的appender

nig*_*ler 11 java logging logback dropwizard

我是dropwizard的新手,我正试图找出更好地配置日志记录的方法.

我在一个捆绑包中注册了一个新的记录器,如下所示:

Logger log = LoggerFactory.getLogger("mylogger");
log.info("this is a log from mylogger");
Run Code Online (Sandbox Code Playgroud)

现在我在一堆服务中使用这个包.默认情况下,通过此记录器的任何日志都将写入应用程序日志文件.

我试图解决的问题是:我希望mylogger(仅)编写的所有日志都转到新文件.将新的appender添加到服务yml文件是相当明星的,如:

logging:

  loggers:

  appenders:
  - type: file.
    currentLogFilename: ./logs/example.log
    archivedLogFilenamePattern: ./logs/example-%d.log.gz
    archivedFileCount: 5
Run Code Online (Sandbox Code Playgroud)

但这意味着现在所有的应用程序日志都会写入example.log.我不知道如何为这个appender专门指定一个不影响/改变现有日志记录的记录器.

有人能告诉我是否有办法在dropwizard中执行此操作?谢谢!

Den*_*yan 12

在Dropwizard 0.9.0(2015年10月28日发布)中,他们增加了对单个记录器追加器的支持并禁用了记录器可加性.

要实现您所描述的内容,您可以在yaml配置文件中指定以下内容 -

logging:
  level: INFO
  loggers:
    "mylogger":
      level: DEBUG
      additive: false
      appenders:
        - type: file
          currentLogFilename: /var/log/mylogger.log
          archivedLogFilenamePattern: /var/log/mylogger-%d.log.gz
          archivedFileCount: 5
  appenders:
    - type: console
Run Code Online (Sandbox Code Playgroud)

将additive添加到false将阻止logger(或其下的任何内容)写入层次结构上方的appender,包括root logger.

参考文献 -


小智 12

如果您希望自定义记录器成为日志文件中的唯一日志,并且进入默认的appender,则可以根据Dropwizard日志记录规范创建自己的appender.

要求:

定制Appender工厂

扩展io.dropwizard.logging.AbstractAppenderFactory (称为MyCustomFactory)

通过在此创建JsonProperties,使用Hibernate Annotations对配置文件中所需的任何验证,可以从.yml文件中注入自定义配置:

@NotNull
@JsonProperty
private String url;
@JsonProperty
private int maxBufferSize = 100;
@JsonProperty
private int sendDelayInSeconds = 10;
Run Code Online (Sandbox Code Playgroud)

给班级一个@JsonTypeName("YourAppenderName").这是您在配置中引用appender的方法.

这个类需要访问你想要传递给appender的任何配置,因为这个类的功能是创建Dropwizard将使用的appender.

自定义Appender

扩展ch.qos.logback.core.AppenderBase(称为MyCustomAppender).您可以自己编写,也可以使用Loggly等服务中的现有服务.

在appender内部,检查日志的来源并过滤您要写入文件的内容.

告诉Dropwizard你的新定制工厂......

您需要一个名为io.dropwizard.logging.AppenderFactory放入src/main/resources/META-INF/services/目录的文件.

此文件的内容是自定义Factory的全名(包括包).(例如:com.myCompany.appender.MyCustomFactory)

使用自定义appender

在您的yml文件中,按您指定的名称添加新的appender:

appenders:
# Log warnings and errors to stderr
- type: console
  threshold: INFO
  target: stderr
# Custom Logger
- type: YourAppenderName
  threshold: INFO
  url: https://sendYourLogsHere/logs
Run Code Online (Sandbox Code Playgroud)