spring云配置可以管理xml文件吗
我们现在使用的spring引导版本是1.5.13.RELEASE,spring云版本是Edgware.SR3,spring云配置版本是1.4.3.RELEASEspring云配置可以管理xml文件吗,xml,spring-boot,logback,spring-cloud,spring-cloud-config,Xml,Spring Boot,Logback,Spring Cloud,Spring Cloud Config,我们现在使用的spring引导版本是1.5.13.RELEASE,spring云版本是Edgware.SR3,spring云配置版本是1.4.3.RELEASE <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${ENCODER_PATTERN}</pattern> </encode
<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>
我们使用eureka 1.7.2作为注册中心,配置服务器和配置客户端就是eureka客户端
<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>
当我们这样想的时候,因为SpringCloud配置是配置服务器,它应该管理我们应用程序的任何类型的配置。因此,我们将logback.xml放在github中,并参考,我们可以通过设置
logging.config=${spring.cloud.config.uri}/*/default/master/logback.xml.
<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>
但是,由于配置服务器和配置客户端是eureka服务器的客户端,因此它应该使用服务名称进行通信。我们将config int设置为config客户端的bootstrap.properties,如下所示:
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/
<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>
但是,当我们启动配置客户端时,配置服务器会发生以下错误:
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
<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>
那么,我如何解决这个问题,而SpringCloud配置不能存储xml或其他类型的文件呢?
如果是这样的话,可能会有很多限制
<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>
我阅读了源代码,发现它可能无法加载xml文件,但为什么会出现这种问题呢
公共静态void fillProperties(Properties props,Resource Resource)引发IOException{
InputStream=resource.getInputStream();
试一试{
字符串filename=resource.getFilename();
if(filename!=null&&filename.endsWith(XML文件扩展名)){
loadFromXML(is);
}
否则{
道具载荷(is);
}
}
最后{
is.close();
}
}
<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>
下面是logback.xml,它可以在独立的spring引导项目中执行
```
<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>
${ENCODER_PATTERN}
../../log/${log-NAME}.%d{yyyy-MM-dd}.log
${ENCODER_PATTERN}
```您可以在git中存储用作spring cloud config server配置存储的任何文本文件,但spring只能自动解析
.properties
和.yml
。对于获取其他文件格式,您应该使用问题中要引用的服务纯文本功能
<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>
但当您开始使用发现服务时,您不能使用propertyspring.cloud.config.uri
,因为url是由eureka客户端自动发现的。因此logging.config
的下一个属性无效:
<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>
logging.config=${spring.cloud.config.uri}/*/default/master/logback.xml
为了从配置服务器获取自定义文件,我们使用discoveryClient,在@PostConstruct中按名称请求配置服务器的URL,并手动下载。但是对于logger来说,这已经太晚了,因为logback需要在引导阶段进行配置。在研究了类似的问题后,我发现可以在引导阶段自定义/设置属性:。所以我们通过设置配置服务器uri的自定义属性来解决这个问题,logback能够下载它的配置文件。更多实现细节请参见。谢谢您的回答,@nmyk,spring cloud配置似乎有很多限制,logback.xml id只是我的一个示例,如果我想集成dubbo.properties,我应该怎么做?我不确定我的评论是否有用,我从未使用过dubbo。但您可以查看一下,看起来所有属性都是在application.properties中管理的,因此它们将自动获取。如果您有不同的系统,并且希望使用xml配置和spring cloud配置,那么您可能应该使用您的代码将它们作为常规文件下载到temp文件夹,然后初始化上下文(我们使用config server中的csv文件使用这种方法)。
<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>