You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Spring Boot向Azure Application Insights实现条件触发详细错误日志

实现方案:Spring Boot 错误触发临时详细日志输出

核心逻辑无需修改 Azure 侧配置,只在应用层实现日志级别动态调整,到期自动回退即可,原有 Azure Application Insights 日志上报规则可直接复用。


1. 引入核心实现代码

1.1 日志级别动态管理工具类

直接操作 Logback 上下文实现日志级别调整、定时回退逻辑

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

public class LogLevelManager {
    private static final org.slf4j.Logger log = LoggerFactory.getLogger(LogLevelManager.class);
    private static final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
    // 标记当前是否处于临时详细日志模式,避免重复触发
    private static final AtomicBoolean isDebugMode = new AtomicBoolean(false);
    // 默认根日志级别
    private static final Level DEFAULT_ROOT_LEVEL = Level.ERROR;
    // 临时开启的日志级别,可按需修改为INFO/DEBUG
    private static final Level TEMP_DEBUG_LEVEL = Level.DEBUG;
    // 临时日志开启时长
    private static final int DEBUG_DURATION_HOURS = 2;

    public static void triggerDebugMode() {
        if (isDebugMode.compareAndSet(false, true)) {
            log.info("检测到错误事件,临时开启{}小时详细日志", DEBUG_DURATION_HOURS);
            // 调整根日志级别
            Logger rootLogger = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
            rootLogger.setLevel(TEMP_DEBUG_LEVEL);

            // 定时2小时后回退日志级别
            scheduler.schedule(() -> {
                rootLogger.setLevel(DEFAULT_ROOT_LEVEL);
                isDebugMode.set(false);
                log.info("临时详细日志已关闭,恢复为默认ERROR级别");
            }, DEBUG_DURATION_HOURS, TimeUnit.HOURS);
        }
    }
}

1.2 监听ERROR级别的事件触发

以下两种方式二选一即可:

方式一:全场景ERROR日志监听(推荐)

自定义 Logback 自定义 Appender,覆盖所有ERROR日志场景(包括手动打印ERROR日志、未捕获异常等所有输出的ERROR事件:

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
import ch.qos.logback.classic.Level;

public class ErrorTriggerAppender extends AppenderBase<ILoggingEvent> {
    @Override
    protected void append(ILoggingEvent eventObject) {
        if (eventObject.getLevel().isGreaterOrEqual(Level.ERROR)) {
            LogLevelManager.triggerDebugMode();
        }
    }
}

将该Appender添加到你的logback.xml配置中:

<!-- 替换为你自己的ErrorTriggerAppender类的完整包路径
<appender name="errorTrigger" class="com.xxx.xxx.ErrorTriggerAppender" />
<root level="ERROR">
    <!-- 原有其他原有appender(控制台、文件、Azure Application Insights相关配置全部保留 -->
    <appender-ref ref="errorTrigger" />
</root>

方式二:仅捕获业务接口异常触发

如果只需要业务接口抛出异常时才开启详细日志,直接加全局异常处理器即可,配置更简单:

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public void handleException(Exception e) {
        // 保留原有异常处理逻辑
        LogLevelManager.triggerDebugMode();
    }
}

2. 适配说明

你原有Azure Application Insights的日志上报配置无需修改,临时调整日志级别后生成的详细日志会自动按照原有规则上报到Azure资源。


注意事项

  • 多实例部署场景下,只有触发错误的实例会单独开启详细日志,不会影响其他正常实例
  • 短时间内多次触发ERROR事件不会重复开启定时器,仅会触发一次2小时倒计时
    内容的提问来源于stack exchange,提问作者Rachit Pandey
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:36:02