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

Sam*_*dhy 35 java logging spring pcf spring-boot

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

Mic*_*ons 41

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

而且你可以使用

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

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

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

  • 值得强调的是,Actuator记录器端点是在1.5.1中添加的,如果你有一个较旧的Spring Boot应用程序<1.5.1 with Actuator,即使提供了其他Actuator端点,你也找不到记录器的端点.我知道,因为我花了很长时间试图解决为什么它不会打开:-) (4认同)
  • 对于Spring Boot 2.1,您必须通过将loggers值添加到management.endpoints.web.exposure.include设置来确保loggers端点暴露于Web。如果您的application.properties文件中没有这样的行,则添加:management.endpoints.web.exposure.include = health,info,loggers,因为它的默认值为health,info (4认同)

Kih*_*ats 9

这是@Michael Simons答案的扩展。使用此方法,您将具有一个用于执行此操作的UI:

这种方法要更长一些,但可以解决更多问题。我们将使用一个名为Spring Boot Admin Server的工具。

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

    <!--Dependency for registering your app as a Spring Boot Admin Server-->
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-server</artifactId>
        <version>1.3.3</version>
    </dependency>
    
    <!--Provide a nice looking ui-->
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-server-ui</artifactId>
        <version>1.3.3</version>
    </dependency>
    
    <!--Dependency for registering your app as a Spring Boot Admin Client-->
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-starter-client</artifactId>
        <version>1.3.0</version>
    </dependency>
    <dependency>
            <groupId>org.jolokia</groupId>
            <artifactId>jolokia-core</artifactId>
    </dependency>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用注释,使您的应用成为Spring Boot Admin Server @EnableAdminServer

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

    将您的应用注册到仍然是您的应用的Spring Boot Admin Server

    spring.boot.admin.url=http://localhost:8031
    
    Run Code Online (Sandbox Code Playgroud)

    指示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
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在您logback.xml只需添加以下行<jmxConfigurator/>。这允许通过JMX配置回发。更多信息在这里

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

一世。只需访问您的Spring Boot Admin Server的URL(在本例中为http:/localhost:8031)即可。

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

iii。单击Details注册的客户,这将带您到另一个页面。

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

v。您可以更改日志级别,它将在运行时更改您的日志级别。这是您期望的摘要

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


Sai*_*eek 8

如果您使用logbackapi配置项目中的日志记录,则可以使用api 的AutoScan功能logback.根据文件

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

<configuration scan="true"> 
  ... 
</configuration> 
Run Code Online (Sandbox Code Playgroud)

请查看By default, the configuration file will be scanned for changes once every minute API文档以获取更多详细信息.


har*_*ddy 8

您可以在控制器中使用以下代码并调用API来更改日志级别

@PostMapping("/changeloglevel")
public void changeloglevel(@RequestParam String loglevel)
{
    LoggerContext loggerContext = (LoggerContext)LoggerFactory.getILoggerFactory();
    loggerContext.getLogger("package where springboot main class resides").setLevel(Level.toLevel(loglevel));   
}
Run Code Online (Sandbox Code Playgroud)

日志级别可以是 ERROR、INFO、WARN 等


小智 6

对于Spring Boot 2.1.5+:

首先,您需要执行器插件:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

其次,您需要像Dennis在评论中所说的那样暴露端点(loggers默认情况下处于禁用状态):

management.endpoints.web.exposure.include=health,info,loggers
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用其余端点获取有关记录器的信息并设置记录级别。

curl -X "GET" "http://localhost:8080/actuator/loggers"
Run Code Online (Sandbox Code Playgroud)

要设置Root日志记录级别,您可以使用

curl -X "POST" "http://localhost:8080/actuator/loggers/ROOT" -H "Content-Type: application/json; charset=utf-8"   -d $'{ "configuredLevel": "INFO" }'
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!`management.endpoints.web.exposure.include=...,loggers` 属性是缺失的部分! (2认同)

And*_*own 3

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

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

<configuration>
  <include resource="org/springframework/boot/logging/logback/base.xml"/>
  <jmxConfigurator />    
</configuration>
Run Code Online (Sandbox Code Playgroud)

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

您现在应该能够访问/jolokiaSpring Boot 应用程序上的端点。该协议记录在此处。这并不漂亮。为了帮助您入门,这里有一些GET您可以直接从浏览器点击的示例:

显示 ROOT 记录器级别:

/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/getLoggerLevel/ROOT
Run Code Online (Sandbox Code Playgroud)

更改 ROOT 记录器级别以进行调试:

/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/setLoggerLevel/ROOT/debug
Run Code Online (Sandbox Code Playgroud)

spring-boot-actuator 知道端点并被/jolokia标记sensitive=true,因此如果类路径上有 spring-security,那么它将需要身份验证。