如何通过http(rest)更改远程应用程序的logback日志级别?到
@Controller
public class ChangeLog2Controller {
@PostMapping("/api/testlog1")
public ResponseModel testLogeBack(@RequestBody LogLevelModel levelModel) {
...
}
}
答案 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(或类似的)中,因此这种方法看起来非常笨拙并且很可能是不可取的。