如何在不重新启动Spring启动应用程序的情况下更改运行时的日志级别

我在PCF中部署了springboot应用程序。 我想根据环境变量记录消息。我应该怎么做才能在不重新启动应用程序的情况下运行时日志级别更改?

可以使用http-endpoint更改Spring Boot 1.5+中的日志级别

 org.springframework.boot spring-boot-starter-actuator  

而且你可以使用

 curl -X "POST" "http://localhost:8080/loggers/de.springbootbuch" \ -H "Content-Type: application/json; charset=utf-8" \ -d $'{ "configuredLevel": "WARN" }' 

其中/ loggers /之外的所有内容都是记录器的名称。

如果你在PCF中运行它会变得更好:这是从它们的后端直接支持的。

从Spring Boot 1.5.x开始, 您可以使用记录器端点来POST所需的日志记录级别 。

如果使用logback api配置项目中的日志记录,则可以使用logback api的AutoScanfunction。 根据文件

logback-classic将扫描其配置文件中的更改,并在配置文件更改时自动重新配置。 为了指示logback-classic扫描其配置文件中的更改并自动重新配置,请将该元素的scan属性设置为true。

  ...  

请查看logback API文档以获取更多详细信息。

默认日志记录提供程序是logback。 要设置系统以便在运行时更改日志记录级别,您需要执行以下步骤:

首先在src/main/resources创建一个名为logback-spring.xml的自定义logback配置,其中包含spring的默认配置器,然后添加通过JMX公开logback配置的指令:

     

现在添加对Jolokia JMX-over-HTTP网桥的依赖: org.jolokia:jolokia-core

您现在应该能够在Spring启动应用程序上点击/jolokia端点。 该协议记录在此处 。 它不漂亮。 为了帮助您入门,以下是一些您可以直接从浏览器中GET示例:

显示ROOT记录器级别:

 /jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/getLoggerLevel/ROOT 

将ROOT记录器级别更改为调试:

 /jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/setLoggerLevel/ROOT/debug 

spring-boot-actuator知道/jolokia端点并且标记为sensitive=true所以如果你在类路径上有spring-security,那么它将需要身份validation。

这是@Michael Simons答案的延伸。 使用此方法,您将拥有用于执行此操作的UI:

这种方法有点长,但它解决了更多 。 我们将使用一个名为Spring Boot Admin Server的工具。

  1. 首先,您需要包含一些依赖项

       de.codecentric spring-boot-admin-server 1.3.3    de.codecentric spring-boot-admin-server-ui 1.3.3    de.codecentric spring-boot-admin-starter-client 1.3.0   org.jolokia jolokia-core  
  2. 使用注释@EnableAdminServer使您的应用成为Spring Boot管理服务器。

     @SpringBootApplication @EnableAdminServer public class Application { public static void main(String[] args) { // ... your code as before ... } } 
  3. 在您的application.properties添加以下内容:

    将您的应用程序注册到Spring Boot Admin Server,它仍然是您的应用程序

     spring.boot.admin.url=http://localhost:8031 

    指示Spring Boot Admin Server在哪里可以找到客户端

     // For versions 2.*.* spring.boot.admin.client.url=http://localhost:8031 // For versions 1.*.* spring.boot.admin.client.service-url=http://localhost:8031 spring.boot.admin.client.management-url=http://localhost:8031 spring.boot.admin.client.health-url=http://localhost:8031/health 
  4. 在你的logback.xml只需添加以下行 。 这允许通过JMX配置logback。 更多信息在这里

…… 瞧,你已经完成了。 现在,您可以在运行时更改任何记录器的调试级别。

一世。 只需访问Spring Boot Admin Server的URL – 在我们的例子中( http:/localhost:8031 )。

II。 注册的应用程序(客户端)列表将显示在主页上。

III。 单击已注册客户端的Details ,这将转到另一个页面。

IV。 单击Logging选项卡,其中将列出应用程序中注册的所有记录器。

v。您可以更改日志级别,它将在运行时更改日志记录级别。 这是你期望的片段

在运行时更改日志记录级别

如果使用Log4j 2进行日志记录,则可以轻松配置它以根据环境变量或系统属性设置要使用的日志级别。 如果以这种方式执行此操作,则无需仅因环境已更改而修改文件。

    ${sys:user.dir}/logs/ ${sys:env:-lab} ${sys:flow_match:-ACCEPT} NEUTRAL DEBUG INFO                                       

您还可以在Web服务中添加设置页面以更新日志级别。 然后可以使用ajax完成此操作。 以下示例包含login和csrf令牌:

首先,添加一些表单以指定新的日志级别。 例如,可以通过使用select元素进行改进。

 

然后,发送请求:

 function submitLogLevelChange() { var className = document.getElementById('logClassName').value; var logLevel = document.getElementById("logLevel").value; $.ajax({ // Set up security, see below. beforeSend: setHeader, type: 'POST', // specify the logger to be modified url: "/loggers/" + className, // specify the new log level data: '{"configuredLevel":"' + logLevel + '"}', contentType: 'application/json', processData: false, }).done(function(data, textStatus, jqXHR) { if (jqXHR.status === 200) { // Happy } else if (jqXHR.status === 401) { // Logged out or not enough user rights } else { //Some other problem } }) .fail(function(jqXHR, textStatus ) { if (jqXHR.status === 200) { // Actually was successful, FireFox has some issues... } else { // Failure } }); } 

以下函数将csrf标记注入POST请求:

 function setHeader(xhr) { var token = $("meta[name='_csrf']").attr("content"); var header = $("meta[name='_csrf_header']").attr("content"); xhr.setRequestHeader(header, token); }