我正在编写一个小型 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 系统?或者相反地延迟处理这些导入的时间点,以便首先初始化日志系统?