如何通过http(rest)更改远程应用程序的logback日志级别?

时间:2017-08-18 08:23:31

标签: java spring-mvc logback

如何通过http(rest)更改远程应用程序的logback日志级别?到

@Controller
public class ChangeLog2Controller {

    @PostMapping("/api/testlog1")
    public ResponseModel testLogeBack(@RequestBody LogLevelModel levelModel) {
    ...
    }
}

1 个答案:

答案 0 :(得分:0)

像这样......

@PostMapping("/api/testlog1")
public ResponseModel testLogeBack(@RequestBody LogLevelModel levelModel) {
    // change the log level for the root logger
    Logger rootLogger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
    rootLogger.setLevel(...);

    // change the log level for a specific logger
    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
    Logger specificLogger = loggerContext.getLogger("com.some.specific.package");
    specificLogger.setLevel(...);
}

...传递到setLevel()的参数类似于Level.INFO,我认为这些参数可以来自LogLevelModel

注意:如果您正在寻找一些动态更改日志记录配置的方法,并且JMX客户端(而不是HTTP客户端)就足够了,那么Logback已经提供了JMX Configurator,只需添加以下内容即可使用here你的logback.xml:<jmxConfigurator />。这将公开一个JMX MBean,您可以使用它来查看和设置日志级别。

编辑1 :根据以下评论,您的要求似乎是调用WebApplicationA并以某种方式启用WebApplicationA来更改记录器的日志级别在里面 WebApplicationB?如果是,那么

  • WebApplicationA必须使用WebApplicationB公开的JMXConfigurator MBean。有一些Java JMX客户端here和{{3}}的示例。但是,为了公开JMXConfigurator,您必须对WebApplicationB的logback.xml有一些控制权,如果是这样的话,那么也许你也可以控制WebApplicationB的实现,在这种情况下它可能会更容易在setLogLevel中公开一个简单的WebApplicationB REST端点,让WebApplicationA调用它而不是使用Java JMX客户端。

  • WebApplicationB必须公开changeLogLevel REST API(具有上面提供的实现)WebApplicationA可以调用。

唯一的另一种选择是WebApplicationA以某种方式更改WebApplicationB使用的logback.xml,而WebApplicationB的logback.xml启动看起来像这样......

<configuration scan="true" scanPeriod="30 seconds" >
    ...
</configuration>

...以便在WebApplicationB的类路径上对此文件所做的任何更改都会在(例如)30秒内被选中。但是,由于WebApplicationB的logback.xml可能嵌入在WAR(或类似的)中,因此这种方法看起来非常笨拙并且很可能是不可取的。