1

我正在尝试在应用程序启动期间从配置服务器读取 log4j2 配置。

引导程序.yml

spring:
  application:
    name: loggingApp
  cloud:
    config:
      uri: http://localhost:8888

logging:
  config: http://localhost:8888/loggingApp/raw/master/loggingApp-log4j2-DEV.xml

当我看到适当的日志级别时,应用程序似乎在启动期间正确获取了配置。但是,自动配置似乎不起作用。当我更改记录器的日志级别时,看起来在 monitorInterval 过去后它没有从配置服务器读取更新的配置。我已将 monitorInterval 设置为 10 秒。根据文档,最小间隔应为 5 秒。如果我指向本地驱动器上的文件,而不是配置服务器 url,它工作正常。我尝试使用-Dlog4j.configurationFileas jvm arg 以及 spring 配置logging.config来查看其中一个是否有效,但没有一个有效。

https://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticReconfiguration

https://logging.apache.org/log4j/2.x/log4j-spring-cloud-config/log4j-spring-cloud-config-client/index.html

我正在使用spring-boot 2.2.5.RELEASE,log4j2 2.13.1spring-cloud Hoxton.SR3版本。

这就是 git repo 的样子,从那里读取配置文件 在此处输入图像描述

4

1 回答 1

0

我也尝试过同样的方法,但没有奏效。似乎<Configuration monitorInternal="10">只有当我们使用log4j.configurationFile属性来加载 log4j2 配置文件时,该属性才会起作用,如Apache 的 Log4j Spring Cloud Configuration Guide中所述。

我使用弹簧执行器刷新方法来完成这项任务。但是,这不会自行重新加载配置。因此,有一些工作可以满足所需的目的。在您的 Spring 应用程序中创建一个调度程序,该调度程序按指定的时间间隔点击执行器刷新 url,如下所示

@Component
@EnableScheduling
public class RefreshScheduler {

    @Autowired
    private RestTemplate restTemplate;

    @Scheduled(fixedRate = 60000)
    private void postRefreshEndPoint() {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<String> entity = new HttpEntity<>(headers);

        restTemplate.postForEntity("http://localhost:8080/actuator/refresh", entity, String.class);
    }
}

这无疑是一种以某种方式实现所需功能的非常肮脏的方式。它虽然有效:)

附带说明: 不自动刷新不是更好吗? 我的论点是:开发人员可能会错误地(或者只是为了好玩)对 GIT 中的配置进行更改。这将导致生产中的实时应用程序发生变化。

但是,如果我们将执行器刷新 URL 作为刷新弹簧上下文的强制要求,则可以停止。只有来自生产/运营团队的授权成员才能访问此刷新 url,并且他们可以决定在 GIT 上的提交完成后是否实际刷新生产 Spring bean。

于 2020-09-30T18:43:39.380 回答