0

我设置了我的 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}" 不是t 解决了。我想再次提一下,如果配置文件位于资源文件夹下,则此方法有效。所以这让我认为问题出在配置服务器上的配置文件上。如果文件在配置服务器上,查找有任何限制吗?

谢谢。

4

1 回答 1

1

我假设您已经查看了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 云配置,它将尝试使用它拥有的信息来解析变量,这不会太多。如果存在,Spring Cloud Config 将在将配置传递回 Log4j 时删除转义字符。

至于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 。

于 2020-08-03T05:02:58.763 回答