巧用环境变量:动态设置 Logback 日志级别的终极指南
- 作者
最近收到了运维的提醒,说我们一天 ES 日志的占用空间超过了 200G,我心里一惊,一刀切把日志设置成 ERROR 级别肯定不合理,会影响业务,只能考虑怎么通过环境变量或者配置动态设置日志级别。本文将介绍如何实现这一目标,并配置默认日志级别。
1. 添加 Logback 依赖
首先,确保你的项目中包含了 Logback 的依赖。如果你使用的是 Maven,请在 pom.xml
中添加以下依赖:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
如果你使用的是 Gradle,请在 build.gradle
中添加以下依赖:
implementation 'ch.qos.logback:logback-classic:1.2.3'
implementation 'ch.qos.logback:logback-core:1.2.3'
2. 配置 logback.xml
在你的项目资源目录下(通常是 src/main/resources
),创建或编辑 logback.xml
文件。使用 variable
元素来获取环境变量的值,并在 root
元素中使用这些变量来动态设置根日志级别。
<configuration>
<!-- 定义一个环境变量,用于设置根日志级别 -->
<variable name="ROOT_LOG_LEVEL" value="${ROOT_LOG_LEVEL:-INFO}" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 根日志记录器 -->
<root level="${ROOT_LOG_LEVEL}">
<appender-ref ref="STDOUT" />
</root>
</configuration>
在上述配置中:
<variable name="ROOT_LOG_LEVEL" value="${ROOT_LOG_LEVEL:-INFO}" />
用于获取环境变量ROOT_LOG_LEVEL
的值。如果环境变量未设置,则默认使用INFO
级别。${ROOT_LOG_LEVEL}
用于在<root>
日志记录器中动态设置日志级别。- 如果使用
<root level="DEBUG">
将日志级别配置成固定值,环境变量ROOT_LOG_LEVEL、logging.level.root都不会生效 - Spring Boot 会按照以下顺序解析配置:
- 命令行参数:最高优先级。
- SPRING_APPLICATION_JSON:嵌入在环境变量中的 JSON 属性。
- Java 系统属性:通过
System.getProperties()
获取。 - 操作系统环境变量:
logging.level.root
的值会被直接识别为 Spring Boot 的日志配置。ROOT_LOG_LEVEL
作为一个普通的环境变量,不会被直接映射到 Spring Boot 的日志配置属性中,除非你在logback.xml
或其他地方显式使用它。
application.properties
或application.yml
文件:默认配置文件。
3. 设置环境变量
确保在运行你的应用程序之前设置了 ROOT_LOG_LEVEL
环境变量。可以在命令行中设置,例如:
- 在 Windows 上:
set ROOT_LOG_LEVEL=DEBUG
- 在 Unix/Linux 或 macOS 上:
export ROOT_LOG_LEVEL=DEBUG
然后运行你的应用程序,Logback 将根据环境变量 ROOT_LOG_LEVEL
的值动态设置根日志级别。
4. 示例代码
假设你有一个简单的 Java 类来测试日志输出:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogbackExample {
private static final Logger logger = LoggerFactory.getLogger(LogbackExample.class);
public static void main(String[] args) {
logger.debug("This is a DEBUG message");
logger.info("This is an INFO message");
logger.warn("This is a WARN message");
logger.error("This is an ERROR message");
}
}
运行该类,并根据不同的 ROOT_LOG_LEVEL
环境变量值观察日志输出的变化。
结语
通过以上配置,你可以根据环境变量动态设置 Logback 的根日志级别,使你的应用程序在不同的环境中有不同的日志输出。这种方法灵活且易于管理,有助于在开发、测试和生产环境中更好地控制日志记录。这样,你可以根据需要调整日志级别,而无需修改和重新部署代码。
希望这篇文章能帮助你更好地理解和使用 Logback 的动态日志级别配置。如果你有任何问题或建议,欢迎在评论区留言。
分享内容