springboot-Change log level to DEBUG at runtime by springboot actuator
1. Introduction
This article would demo how to change logger level to DEBUG at runtime by springboot acutator http endpoints.
2. Environments
- SpringBoot 1.5.1+ or SpringBoot 2.x
We have a class that print logs to change at runtime, the code is:
package com.bswen.sb1jt.commands;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class MyLoggerCommand implements CommandLineRunner {
private static Logger logger = LoggerFactory.getLogger(MyLoggerCommand.class);
@Override
public void run(String... strings) throws Exception {
while(true) {
Thread.sleep(1000);
logger.debug("debug level log");
logger.info("info level log");
}
}
}
You can see that, this command is just printing logs with DEBUG and INFO level.
And we have this settings in application.properties:
logging.level.=ERROR
logging.level.com.bswen.sb1jt=INFO
So , we only get this logs over and over:
2019-06-02 21:17:30,928 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
2019-06-02 21:17:31,930 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
2019-06-02 21:17:32,931 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
2019-06-02 21:17:33,937 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
2019-06-02 21:17:34,940 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
2019-06-02 21:17:35,943 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
2019-06-02 21:17:36,949 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
2019-06-02 21:17:37,950 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
Now we want to show the DEBUG level logs, how to do it without restarting the app?
3. For springboot 1.5.1+
For SpringBoot 1.5.1+ users, first, you should add this dependency:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Then add this property to your application.properties:
management.security.enabled=false
Finally, you can access the actuator endpoints to change the logging level like this:
curl -X "POST" "http://localhost:8080/loggers/com.bswen.sb1jt" -H "Content-Type: application/json; charset=utf-8" -d $'{"configuredLevel": "DEBUG"}'
- By default 8080 port:
In a standalone application, the Actuator HTTP port defaults to the same as the main HTTP port. To make the application listen on a different port, set the external property: management.server.port. To listen on a completely different network address (such as when you have an internal network for management and an external one for user applications), you can also set management.server.address to a valid IP address to which the server is able to bind.
- the url loggers/com.bswen.sb1jt is the logger you want to change, com.bswen.sb1jt is your package name.
Then you can see the logging outputs, it changes to :
2019-06-02 21:17:36,949 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
2019-06-02 21:17:37,950 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
2019-06-02 21:17:38,955 DEBUG [main] com.bswen.sb1jt.commands.MyLoggerCommand: debug level log
2019-06-02 21:17:38,956 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
2019-06-02 21:17:39,957 DEBUG [main] com.bswen.sb1jt.commands.MyLoggerCommand: debug level log
2019-06-02 21:17:39,957 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
2019-06-02 21:17:40,958 DEBUG [main] com.bswen.sb1jt.commands.MyLoggerCommand: debug level log
It works!
4. For SpringBoot 2.x
For SpringBoot 2+ users, first, you should add this dependency:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Then add this property to your application.properties:
management.endpoints.web.exposure.include=*
Finally, you can access the actuator endpoints to change the logging level like this:
curl -X "POST" "http://localhost:8080/actuator/loggers/com.bswen.sb1jt" -H "Content-Type: application/json; charset=utf-8" -d $'{"configuredLevel": "DEBUG"}'
- By default 8080 port:
In a standalone application, the Actuator HTTP port defaults to the same as the main HTTP port. To make the application listen on a different port, set the external property: management.server.port. To listen on a completely different network address (such as when you have an internal network for management and an external one for user applications), you can also set management.server.address to a valid IP address to which the server is able to bind.
- the url /actuator/loggers/com.bswen.sb1jt is the logger you want to change, com.bswen.sb1jt is your package name. And notice the prefix /actuator, it’s different from the SpringBoot 1.5.x
Then you can see the logging outputs, it changes to :
2019-06-02 21:17:36,949 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
2019-06-02 21:17:37,950 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
2019-06-02 21:17:38,955 DEBUG [main] com.bswen.sb1jt.commands.MyLoggerCommand: debug level log
2019-06-02 21:17:38,956 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
2019-06-02 21:17:39,957 DEBUG [main] com.bswen.sb1jt.commands.MyLoggerCommand: debug level log
2019-06-02 21:17:39,957 INFO [main] com.bswen.sb1jt.commands.MyLoggerCommand: info level log
2019-06-02 21:17:40,958 DEBUG [main] com.bswen.sb1jt.commands.MyLoggerCommand: debug level log
It works!
5. Summary
It’s easy to change the logging level at runtime by using SpringBoot actuator, but you should notice the security issues of the actuator endpoints. I would introduce more security features of SpringBoot actuators in the future.