Spring 配置服务器查找中的 log4j2 配置文件不起作用

log4j2 configuration file in Spring Config Server lookups don't work

我设置我的 spring-boot 应用程序以从配置服务器获取 log4j2 配置文件。但是查找不起作用。如果我将日志配置文件放在资源文件夹下,它就可以正常工作。如果文件在配置服务器上,监视间隔也不起作用。

我的配置文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="60">
    <Appenders>
        <Console name="ConsoleJSONAppender" target="SYSTEM_OUT">
            <JSONLayout complete="false" compact="false" eventEol="true" properties="false" stacktraceAsString="true">
                <KeyValuePair key="correlation-id" value="${ctx:CORRELATION_ID}" />
                <KeyValuePair key="timestamp" value="${date:yyyy-MM-dd'T'HH:mm:ss.SSSZ}" />
            </JSONLayout>
        </Console>

    </Appenders>

    <Loggers>
        <AsyncRoot level="info">
            <AppenderRef ref="ConsoleJSONAppender" />
        </AsyncRoot>
        
    </Loggers>

</Configuration>

配置已从配置服务器正确加载,因为日志采用 json 格式,但“${date:yyyy-MM-dd'T'HH:mm:ss.SSSZ}”和 "${ctx:CORRELATION_ID}" 没有解决。我想再次提及,如果配置文件位于资源文件夹下,则此方法有效。所以这让我认为问题出在配置服务器上的配置文件上。如果文件在配置服务器上,对查找有任何限制吗?

谢谢。

我假设您已经查看了 https://github.com/apache/logging-log4j2/tree/release-2.x/log4j-spring-cloud-config/log4j-spring-cloud-config-samples 的示例项目?它有一个示例客户端和一个示例 Spring Cloud Config 服务,带有本地存储库。如果您查看服务器 config-repo 目录中的示例 log4j2.xml,您会注意到许多查找变量被转义为 ${ctx:CORRELATION_ID}。没有这个 Spring 云配置将尝试使用它拥有的信息来解析变量,这不会太多。如果存在,转义字符将在配置传回 Log4j 时被 Spring Cloud Config 删除。

至于 monitorInterval,当为 SpringCloudConfig 设置它时,如果它是一个正值,Log4j 将在每个时间间隔对 url 进行 GET 调用。如果它收到 Not Modified 响应,则什么也不会发生。如果它收到配置,它将重新配置。如果 monitorInterval 为 0,则 Log4j 将侦听来自 Spring Cloud Bus 的事件,指示在请求配置时发生了更改。同样,如果返回 Not Modified,则表示其他事件触发了事件,配置将保持不变。

要使 Spring Cloud Bus 通知正常工作 Spring Cloud Config 需要配置为将事件推送到应用程序,并且应用程序需要配置为使用相同类型的消息代理侦听它们使用的服务器。最后,假设您正在使用 Git,Spring Cloud Config 服务器需要配置一个 Web 钩子来侦听来自您的后备存储库的事件。有关更多信息,请参阅 https://cloud.spring.io/spring-cloud-config/multi/multi__push_notifications_and_spring_cloud_bus.html