how do I change log level in runtime without restarting spring boot application

后端 未结 10 982
北荒
北荒 2020-12-23 19:55

I have deployed springboot application in PCF . I want to log the message based on the environment variable .What should I do so that the run time log level change will work

相关标签:
10条回答
  • 2020-12-23 20:18

    This is an extension of @Michael Simons answer. With this method you will have a UI for doing that:

    This method is a bit longer but it solves much much more. We are going to use a tool called Spring Boot Admin Server.

    1. First you need to include some dependencies

      <!--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>
      
    2. Enable your app to be a Spring Boot Admin Server using the annotation @EnableAdminServer.

      @SpringBootApplication
      @EnableAdminServer
      public class Application {
         public static void main(String[] args) {
            // ... your code as before ...
         }
      }
      
    3. In your application.properties add the following:

      Register your app to the Spring Boot Admin Server which is still your app

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

      Instruct Spring Boot Admin Server where to find the client

      // 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. In your logback.xml just add the following line <jmxConfigurator/>. This allows configuration of logback via JMX. More info here

    ... and voila you are done. Now you can change the debug level for any logger at runtime.

    i. Just visit the url for your Spring Boot Admin Server-in our case here (http:/localhost:8031).

    ii. A list of applications (clients) registered will be displayed on the home page.

    iii. Click Details against the registered clients which will take you to another page.

    iv. Click the Logging tab which will list all loggers registered in your application.

    v. You can change the log levels it will change your logging level at runtime. Here is a snippet of what you expect

    0 讨论(0)
  • 2020-12-23 20:18

    Since Spring Boot 1.5.x, you can use logger endpoint to POST desired logging level.

    0 讨论(0)
  • 2020-12-23 20:19

    Changing the log level in Spring Boot 1.5+ can be done with a http-endpoint

    Add

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    

    and than you can use

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

    Where everything beyond /loggers/ is the name of the logger.

    If you running this in PCF it get's even better: This is directly supported from their backend.

    0 讨论(0)
  • 2020-12-23 20:19

    You can use following code in controller and call the API to change log level

    @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));   
    }
    

    The loglevel can be ERROR, INFO, WARN , etc

    0 讨论(0)
  • 2020-12-23 20:20

    The default logging provider is logback. To setup your system so that the logging level can be changed at runtime you need to perform the following steps:

    Firstly in src/main/resources create a custom logback configuration named logback-spring.xml that includes spring's default configurator and then adds the directive that exposes logback configuration over JMX:

    <configuration>
      <include resource="org/springframework/boot/logging/logback/base.xml"/>
      <jmxConfigurator />    
    </configuration>
    

    Now add a dependency on the Jolokia JMX-over-HTTP bridge: org.jolokia:jolokia-core.

    You should now be able to hit /jolokia endpoints on your spring boot application. The protocol is documented here. It's not pretty. To get you started, here's a few GET examples that you can hit straight from a browser:

    Show ROOT logger level:

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

    Change ROOT logger level to debug:

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

    spring-boot-actuator is aware of the /jolokia endpoint and it is marked sensitive=true so if you have spring-security on the classpath then it will require authentication.

    0 讨论(0)
  • 2020-12-23 20:21

    For Spring Boot 2.1.5+:

    First, you need the actuator Plugin:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    

    Second, you need to expose the endpoint like Dennis said in his comment (loggers is disabled by default):

    management.endpoints.web.exposure.include=health,info,loggers
    

    Finally, you can use the Rest Endpoints to get Information about the loggers and set the logging levels.

    curl -X "GET" "http://localhost:8080/actuator/loggers"
    

    To set the Root logging Level you can use

    curl -X "POST" "http://localhost:8080/actuator/loggers/ROOT" -H "Content-Type: application/json; charset=utf-8"   -d $'{ "configuredLevel": "INFO" }'
    
    0 讨论(0)
提交回复
热议问题