Logo

巧用环境变量:动态设置 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 会按照以下顺序解析配置:
    1. 命令行参数:最高优先级。
    2. SPRING_APPLICATION_JSON:嵌入在环境变量中的 JSON 属性。
    3. Java 系统属性:通过 System.getProperties() 获取。
    4. 操作系统环境变量
      • logging.level.root 的值会被直接识别为 Spring Boot 的日志配置。
      • ROOT_LOG_LEVEL 作为一个普通的环境变量,不会被直接映射到 Spring Boot 的日志配置属性中,除非你在 logback.xml 或其他地方显式使用它。
    5. application.propertiesapplication.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 的动态日志级别配置。如果你有任何问题或建议,欢迎在评论区留言。

分享内容