我们现在使用的是spring boot版本是1.5.13.RELEASE,而spring cloud版本是Edgware.SR3,而spring cloud配置版本是1.4.3.RELEASE。
我们使用eureka 1.7.2作为我们的注册中心,config-server和config-client是eureka-client。
当我们认为,因为spring cloud配置是配置服务器,它应该管理我们的应用程序的任何类型的配置。所以我们把logback.xml放到github并引用spring cloud doc,我们可以通过设置
来获取config-client中的logback.xml logging.config=${spring.cloud.config.uri}/*/default/master/logback.xml.
但是,由于config-server和config-client是eureka-server的客户端,因此它应该使用服务名称进行通信。我们在config-client的bootstrap.properties中设置config int,如:
spring.cloud.config.name=logback
spring.cloud.config.profile=default
spring.cloud.config.label=master
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=config-server-name
eureka.client.serviceUrl.defaultZone=http://admin:admin@localhost:7001/eureka/
但是,当我们启动config-client时,config-server会出现以下错误:
java.lang.IllegalStateException: Failed to load property source from location 'file:/D:/others/test/configBack/qing-cloud-m1-config/logback-spring.xml'
Caused by: java.util.InvalidPropertiesFormatException: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 16; 文档根元素 "configuration" 必须匹配 DOCTYPE 根 "null"。
at sun.util.xml.PlatformXmlPropertiesProvider.load(PlatformXmlPropertiesProvider.java:80)
at java.util.Properties$XmlSupport.load(Properties.java:1201)
at java.util.Properties.loadFromXML(Properties.java:881)
at org.springframework.core.io.support.PropertiesLoaderUtils.fillProperties(PropertiesLoaderUtils.java:136)
at org.springframework.core.io.support.PropertiesLoaderUtils.loadProperties(PropertiesLoaderUtils.java:121)
at org.springframework.boot.env.PropertiesPropertySourceLoader.load(PropertiesPropertySourceLoader.java:44)
at org.springframework.boot.env.PropertySourcesLoader.load(PropertySourcesLoader.java:128)
at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.doLoadIntoGroup(ConfigFileApplicationListener.java:490)
at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.loadIntoGroup(ConfigFileApplicationListener.java:473)
... 87 common frames omitted
那么我怎样才能解决这个问题,而spring cloud配置无法存储xml或其他类型的文件? 如果是这样,它可能有很多限制
我阅读了源代码并发现它可能可以加载xml文件,但为什么会出现这些问题
public static void fillProperties(Properties props, Resource resource) throws IOException {
InputStream is = resource.getInputStream();
try {
String filename = resource.getFilename();
if (filename != null && filename.endsWith(XML_FILE_EXTENSION)) {
props.loadFromXML(is);
}
else {
props.load(is);
}
}
finally {
is.close();
}
}
logback.xml位于下方,它将在独立的spring boot项目中执行 ```
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
</appender>
<appender name="FILE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>../../log/${LOG-NAME}.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
</appender>
<logger name="cn.jz" additivity="false" level="DEBUG">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE-APPENDER"/>
</logger>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
</root>
```
答案 0 :(得分:2)
您可以在git中存储任何文本文件,该文件用作spring-cloud-config服务器的配置存储,但是Spring只能自动解析.properties
和.yml
。要获取其他文件格式,您应该使用“提供纯文本”功能,该功能是您在问题中所引用的。
但是,当您开始使用发现服务时,不能使用属性spring.cloud.config.uri
,因为url是由eureka客户端自动发现的。因此logging.config
的下一个属性无效:
logging.config=${spring.cloud.config.uri}/*/default/master/logback.xml
为了从配置服务器中获取自定义文件,我们使用了DiscoveryClient,在@PostConstruct中按名称请求了配置服务器的URL并手动下载了。但是对于记录器来说将为时已晚,因为回滚需要在引导阶段进行配置。在研究了类似的问题之后,我发现可以在Bootstrap阶段Customizing bootstrap property sources中自定义/设置属性。因此,我们通过设置config-server-uri的自定义属性来解决此问题,并且logback能够下载其配置文件。在my answer in stackOverflow中有更多实施细节。