1

我正在编写一个小型 Spring Boot 应用程序,我想从 Hashi Corp Vault 中读取一些属性,这些属性最终将在 Kubernetes 环境中运行。我通过使用 spring.cloud.vault 库和使用多个 spring.config.import 语句从 Vault 读取各种秘密路径来做到这一点。

我的 application.yaml 中有以下内容

spring:
  cloud:
    vault:
      uri: http://vault.vault.svc.cluster.local:8200
      connection-timeout: 5000
      read-timeout: 15000
      authentication: kubernetes
      kubernetes:
        role: ${vault.role.name}
        kubernetes-path: kubernetes
        service-account-token-file: /var/run/secrets/kubernetes.io/serviceaccount/token
  config:
    import:
      - vault://${secrets.engine.path}/${path1}
      - vault://${secrets.engine.path}/${path1}/${subpath}

在出现问题的情况下,spring cloud vault library 将无法静默检索秘密,并且相应的 PropertySources 将为空,这很好,在这种情况下是可取的。但是,我希望能够将失败原因写入日志以使其更易于调试。类中有合适的调试org.springframework.vault.core.env.LeaseAwareVaultPropertySource可以写出我一直试图启用的加载错误:

private void loadProperties() {

        if (logger.isDebugEnabled()) {
            logger.debug(String.format("Requesting secrets from Vault at %s using %s", this.requestedSecret.getPath(),
                    this.requestedSecret.getMode()));
        }

        this.secretLeaseContainer.addLeaseListener(this.leaseListener);
        this.secretLeaseContainer.addErrorListener(this.leaseListener);
        this.secretLeaseContainer.addRequestedSecret(this.requestedSecret);

        Exception loadError = this.loadError;
        if (this.notFound || loadError != null) {

            String msg = String.format("Vault location [%s] not resolvable", this.requestedSecret.getPath());

            if (this.ignoreSecretNotFound) {
                if (logger.isInfoEnabled()) {
                    logger.info(String.format("%s: %s", msg, loadError != null ? loadError.getMessage() : "Not found"));
                }
            }
            else {
                if (loadError != null) {
                    throw new VaultPropertySourceNotFoundException(msg, loadError);
                }
                throw new VaultPropertySourceNotFoundException(msg);
            }
        }
    }

我遇到的大多数文章都建议可以通过 application.yaml 启用日志记录上下文,但在这种情况下这对我不起作用。然后我尝试在启动应用程序时将其设置为系统属性: -Dlogging.level.org.springframework.vault.core.env.LeaseAwareVaultPropertySource=DEBUG 甚至更广泛地设置-Dlogging.level.org.springframework=TRACE

经过一些调试后,我可以看到使用系统属性,记录器的级别设置正确,但日志语句没有被写出。

我现在相信经过进一步调试后,问题是因为 spring.config.imports 在准备环境时在 Spring 应用程序启动时很早就处理了,并且只有在此之后才初始化 LogbackLoggingSystem,这意味着在此之前没有写出任何日志记录.

所以我的问题是我完全卡住了,有没有办法真正让 LeaseAwareVaultPropertySource 中的日志记录出现在日志中?是否可以在应用程序启动之前配置 Spring boot 以在完全准备好环境之前设置 Logging 系统?或者相反地延迟处理这些导入的时间点,以便首先初始化日志系统?

4

0 回答 0