spring boot配置文件、日志配置和代码的多环境配置
一般项目都逃不掉开发、测试和生产这三套环境,如果每次给这三套环境打包都去改配置,累死不说,还一不留心就出差错。倒不如每套环境各给一套配置来的轻松。上代码:
1、通用配置放在application.properties(用yml也一样的):
#本端口名 server.port=8181 #本服务名 spring.application.name=translator-provider #指定环境 spring.profiles.active=prod #指定日志 logging.config=classpath:logback-${spring.profiles.active}.xml #合成音频文件名 tts_fileName=audio.pcm
2、各环境自己的配置放在application-环境.properties(yml同理):
application-prod.properties:
#语音识别音频文件保存路径 iat_filePath=/home/wulf/translate/input #语音解析音频文件保存路径 tts_filePath=/home/wulf/translate/output #对外合成音频路径 tts_prefix=wulf.com/translate/audio/ #白名单 white_ips=192.111.30.75|192.111.40.75
application-dev.properties:
#语音识别音频文件保存路径 iat_filePath=/home/wumanshu/input #语音解析音频文件保存路径 tts_filePath=/home/wumanshu/output #对外合成音频路径 tts_prefix=192.111.6.22:${server.port}/audio/ #白名单 white_ips=192.111.166.157|192.111.166.158
application-test.properties:
#语音识别音频文件保存路径 iat_filePath=/home/lulu/input
#语音解析音频文件保存路径 tts_filePath=/home/lulu/output #对外合成音频路径 tts_prefix=192.111.6.23:${server.port}/audio/ #白名单 white_ips=192.111.166.157|192.111.166.158
3、日志配置由application.properties中的logging.config指定,可以看到最终仍是由spring.profiles.active来敲定,同application-环境.properties,我们只需配置logback-环境.xml即可,这里的“环境”变量需要跟spring.profiles.active变量相等:
logback-prod.xml:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <property name="appName" value="wulf"/> <property name="LOG_HOME" value="/home/wulf/translate"/> <Property name="cdr-directory-send" value="/home/wulf/translate/REPORT/send"/> <Property name="file-suffix" value="%d{yyyyMMdd}"/> <Property name="pv-type" value="5L"/> <!-- 配置本机的IP地址,去掉.,每段不足三位的,前端补零 --> <Property name="ipStr" value="192168030074"/> <!-- 应用端口号,不足五位的前端补零凑够五位 --> <Property name="portStr" value="08181"/> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <property name="LOG_PATTERN" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n"/> <!--控制台日志, 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> </filter> <encoder> <pattern>${LOG_PATTERN}</pattern> <charset>utf-8</charset> </encoder> </appender> <!--文件日志, 按照每天生成日志文件 --> <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${LOG_HOME}/logs/error-${file-suffix}.log</FileNamePattern> <!--日志文件保留天数--> <MaxHistory>30</MaxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> </filter> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${LOG_PATTERN}</pattern> <charset>utf-8</charset> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!--话单 当文件大小达到10M时,新建文件输出话单 --> <appender name="CDR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${cdr-directory-send}/${appName}${ipStr}${portStr}${pv-type}%d{yyyyMMddHHmm}.txt </FileNamePattern> <!--日志文件保留天数--> <MaxHistory>30</MaxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%m%n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <root level="DEBUG"> <appender-ref ref="STDOUT"/> </root> <!--error日志--> <logger name="com.wlf.translateprovider" level="ERROR" additivity="false"> <appender-ref ref="ERROR"/> <appender-ref ref="STDOUT"/> </logger> <!--话单--> <logger name="com.wlf.translateprovider.cdr" level="ERROR" additivity="false"> <appender-ref ref="CDR"/> </logger> </configuration>
logback-dev.xml:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <property name="appName" value="wumanshu"/> <property name="LOG_HOME" value="/home/wumanshu"/> <Property name="cdr-directory-send" value="/home/wumanshu/REPORT/send"/> <Property name="file-suffix" value="%d{yyyyMMdd}"/> <Property name="pv-type" value="5L"/> <!-- 配置本机的IP地址,去掉.,每段不足三位的,前端补零 --> <Property name="ipStr" value="192168007921"/> <!-- 应用端口号,不足五位的前端补零凑够五位 --> <Property name="portStr" value="08181"/> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <property name="LOG_PATTERN" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n"/> <!--控制台日志, 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> </filter> <encoder> <pattern>${LOG_PATTERN}</pattern> <charset>utf-8</charset> </encoder> </appender> <!--文件日志, 按照每天生成日志文件 --> <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${LOG_HOME}/logs/error-${file-suffix}.log</FileNamePattern> <!--日志文件保留天数--> <MaxHistory>30</MaxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> </filter> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${LOG_PATTERN}</pattern> <charset>utf-8</charset> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!--话单 当文件大小达到10M时,新建文件输出话单 --> <appender name="CDR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${cdr-directory-send}/${appName}${ipStr}${portStr}${pv-type}%d{yyyyMMddHHmm}.txt </FileNamePattern> <!--日志文件保留天数--> <MaxHistory>30</MaxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%m%n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <root level="DEBUG"> <appender-ref ref="STDOUT"/> </root> <!--error日志--> <logger name="com.wlf.translateprovider" level="INFO" additivity="false"> <appender-ref ref="ERROR"/> <appender-ref ref="STDOUT"/> </logger> <!--话单--> <logger name="com.wlf.translateprovider.cdr" level="ERROR" additivity="false"> <appender-ref ref="CDR"/> </logger> </configuration>
logback-test.xml:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <property name="appName" value="lulu"/> <property name="LOG_HOME" value="/home/lulu"/> <Property name="cdr-directory-send" value="/home/lulu/REPORT/send"/> <Property name="file-suffix" value="%d{yyyyMMdd}"/> <Property name="pv-type" value="5L"/> <!-- 配置本机的IP地址,去掉.,每段不足三位的,前端补零 --> <Property name="ipStr" value="127000000001"/> <!-- 应用端口号,不足五位的前端补零凑够五位 --> <Property name="portStr" value="08181"/> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <property name="LOG_PATTERN" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n"/> <!--控制台日志, 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> </filter> <encoder> <pattern>${LOG_PATTERN}</pattern> <charset>utf-8</charset> </encoder> </appender> <!--文件日志, 按照每天生成日志文件 --> <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${LOG_HOME}\logs\error-${file-suffix}.log</FileNamePattern> <!--日志文件保留天数--> <MaxHistory>30</MaxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> </filter> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${LOG_PATTERN}</pattern> <charset>utf-8</charset> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!--话单 当文件大小达到10M时,新建文件输出话单 --> <appender name="CDR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${cdr-directory-send}/${appName}${ipStr}${portStr}${pv-type}%d{yyyyMMddHHmm}.txt </FileNamePattern> <!--日志文件保留天数--> <MaxHistory>30</MaxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%m%n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <root level="DEBUG"> <appender-ref ref="STDOUT"/> </root> <!--error日志--> <logger name="com.wlf.translateprovider" level="ERROR" additivity="false"> <appender-ref ref="ERROR"/> <appender-ref ref="STDOUT"/> </logger> <!--话单--> <logger name="com.wlf.translateprovider.cdr" level="ERROR" additivity="false"> <appender-ref ref="CDR"/> </logger> </configuration>
4、不同环境跑不同的代码也简单,带上@Profile注解即可:
WebConfigurerProd:
package com.wlf.translateprovider.config; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Profile("prod") @Configuration public class WebConfigurerProd implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/audio/**").addResourceLocations("file:/home/wulf/translate/output/"); } }
WebConfigurerDev:
package com.wlf.translateprovider.config; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Profile("dev") @Configuration public class WebConfigurerDev implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/audio/**").addResourceLocations("file:/home/wumanshu/output/"); } }
WebConfigurerTest:
package com.wlf.translateprovider.config; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Profile(value = "test") @Configuration public class WebConfigurerTest implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/audio/**").addResourceLocations("file:D:\\output\\"); } }
打完收工。指定环境除了在打包时指定application.properties中的spring.profiles.active=你要的环境外,也可以在启动jar包时指定,它的优先级大于你jar包里的配置。比如我打的包指定的是生成环境prod,依然可在启动时使用测试环境test来跑:
nohup java -jar translate-provider-1.0.0-SNAPSHOT.jar --spring.profile.active=test >/dev/null 2>&1 &
但这在里并不合适,因为logback-环境.xml是根据application.properties中指定的环境打包打出来的,启动时会检查对应的日志配置信息。举个例子,如果你打包用了prod,启动却指定了test,那么启动时仍去logback-prod.xml中加载/home/wulf,而你当前应该是在test环境/home/lulu,会提示找不到/home/wulf/logs和/home/wulf/REPORT。