### Logging in Spring Boot
Logging is an essential part of any application, as it provides insights into the system's behavior and
helps in debugging and monitoring. Spring Boot provides extensive support for logging and
integrates seamlessly with popular logging frameworks.
### Logging Frameworks Supported by Spring Boot
Spring Boot supports the following logging frameworks:
1. **Java Util Logging (JUL)**
2. **Logback** (default logging framework in Spring Boot)
3. **Log4j2**
By default, Spring Boot uses **Logback** for logging.
---
### How Logging Works in Spring Boot
1. **Default Logging Setup**:
- When you create a Spring Boot application, logging is configured automatically.
- Logback is used as the default implementation.
- Logs are output to the console by default.
2. **Default Logging Levels**:
Spring Boot supports the following logging levels in ascending order of severity:
- `TRACE`: Fine-grained information, useful for debugging.
- `DEBUG`: Detailed information on the application's flow.
- `INFO`: General application events.
- `WARN`: Potentially harmful situations.
- `ERROR`: Error events that might still allow the application to run.
- `FATAL`: Severe errors causing the application to abort (not commonly used in modern logging
frameworks).
Each logging level includes all the levels below it.
3. **Default Log Pattern**:
By default, Spring Boot uses a simple log format:
```
yyyy-MM-dd HH:mm:ss.level [thread] loggerName - message
```
---
### Configuration of Logging in Spring Boot
You can configure logging in Spring Boot using:
#### 1. **application.properties / application.yml**
Spring Boot provides a simple way to configure logging levels via properties.
For example, in `application.properties`:
```properties
logging.level.root=INFO
logging.level.com.example.myapp=DEBUG
logging.file.name=app.log # Log to a specific file
logging.file.path=/var/logs # Log to a directory
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n # Console log format
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n # File
log format
```
In `application.yml`:
```yaml
logging:
level:
root: INFO
com.example.myapp: DEBUG
file:
name: app.log
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
```
#### 2. **Logback Configuration File**
Spring Boot uses Logback as the default logging framework. You can customize it by creating a
`logback-spring.xml` file in the `src/main/resources` directory.
Example `logback-spring.xml`:
```xml
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
```
---
### Changing the Logging Framework
Spring Boot provides flexibility to switch the default logging framework. To use another framework:
1. **Log4j2**:
- Exclude the default Logback dependency:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<scope>provided</scope>
</dependency>
```
- Include Log4j2 dependencies:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
```
2. **Java Util Logging**:
- Spring Boot automatically supports JUL if Logback and Log4j2 are excluded.
---
### Logging in Code
You can log messages in your application using the `org.slf4j.Logger` interface. Spring Boot
promotes the use of SLF4J for logging.
Example:
```java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RestController
public class MyController {
private static final Logger logger = LoggerFactory.getLogger(MyController.class);
@GetMapping("/example")
public String example() {
logger.info("Handling example request");
logger.debug("This is a debug message");
return "Example";
```
---
### Advanced Logging Features in Spring Boot
1. **Profiles-Based Logging**:
- You can create different log configurations for different environments using profiles
(`application-{profile}.properties`).
2. **Externalized Configuration**:
- Place logging configuration files outside the application JAR for easier updates in production.
3. **Actuator Logging**:
- With Spring Boot Actuator, you can manage log levels dynamically at runtime using endpoints
(`/actuator/loggers`).
---
### Key Points
- By default, Spring Boot uses Logback for logging.
- You can configure logging levels and patterns in `application.properties` or `logback-spring.xml`.
- Logging can be switched to Log4j2, JUL, or other frameworks if required.
- Use SLF4J in your code for better flexibility and abstraction.
Logging in Spring Boot is simple to configure and customize, making it powerful for debugging and
monitoring applications.