Dropwizard服务关闭时如何强制日志轮换?

时间:2014-12-17 01:03:51

标签: slf4j logback dropwizard

我的服务每小时都有一个日志。活动日志文件是service.log。存档文件名称类似于service-2014-12-15-03.log.gz 但是,如果我在10:59停止服务并从11:01开始,服务将继续写入service.log,并且只会在11:59进行轮换,并且服务时间为2014-12-15-11.log .gz包含2小时的日志。我想在服务关闭时强制进行日志轮换。

我相信我的问题包括3个部分:

  1. 如何挂钩关闭Dropwizard服务?
  2. 如何访问Logback实例(这里我可能完全错了)?
  3. 如何强制日志轮换?
  4. 我用谷歌搜索了几个小时但没有找到任何答案。我还在GitHub上查看了Dropwizard源代码。

    请帮忙。我在Dropwizard 0.6.2上,但如果0.7.x中存在解决方案,我可以升级。

    ====更新====

    main方法中的关闭钩子有效。托管对象停止也有效。并且FYI在关闭钩子之后停止调用托管对象。

    ^Cshutdown Hook called
    INFO  [2014-12-17 20:35:07,861] org.eclipse.jetty.server.Server: Graceful shutdown SocketConnector@0.0.0.0:9051
    INFO  [2014-12-17 20:35:07,862] org.eclipse.jetty.server.Server: Graceful shutdown InstrumentedBlockingChannelConnector@0.0.0.0:9050
    INFO  [2014-12-17 20:35:07,863] org.eclipse.jetty.server.Server: Graceful shutdown o.e.j.s.ServletContextHandler{/,null}
    INFO  [2014-12-17 20:35:07,864] org.eclipse.jetty.server.Server: Graceful shutdown o.e.j.s.ServletContextHandler{/,null}
    INFO  [2014-12-17 20:35:09,918] org.eclipse.jetty.server.handler.ContextHandler: stopped o.e.j.s.ServletContextHandler{/,null}
    INFO  [2014-12-17 20:35:09,918] org.eclipse.jetty.server.handler.ContextHandler: stopped o.e.j.s.ServletContextHandler{/,null}
    Managed object stop called
    

    我仍然需要问题2和3的帮助。

2 个答案:

答案 0 :(得分:1)

当dropwizard应用程序停止运行时,我也在寻找关闭资源的方法。我在dropwizard应用程序类中注册了一个关闭钩子(即应用程序开始使用main方法的类)。

        Runtime.getRuntime().addShutdownHook(new Thread() {
          public void run() {
                System.out.println("shutdown Hook called");
                //database.close();
          }
        });

查看here以强制进行回滚轮换。如果这样可行,则无需担心获取logback实例。

编辑:

这个link会对您有所帮助,唯一的区别是它们会在应用程序启动时轮流而非关机时间。

答案 1 :(得分:-1)

您可以使用dropwizards managed objects来注册需要在dropwizard生命周期内的start / stop执行的组件。