一般项目都逃不掉开发、测试和生产这三套环境,如果每次给这三套环境打包都去改配置,累死不说,还一不留心就出差错。倒不如每套环境各给一套配置来的轻松。上代码:

  

  1、通用配置放在application.properties(用yml也一样的):

#本端口名
server.port=
#本服务名
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/wulinfeng/translate/input
#语音解析音频文件保存路径
tts_filePath=/home/wulinfeng/translate/output
#对外合成音频路径
tts_prefix=wlf.com/translate/audio/
#白名单
white_ips=192.168.30.75|192.168.40.75

  application-dev.properties:

#语音识别音频文件保存路径
iat_filePath=/home/wumanshu/input
#语音解析音频文件保存路径
tts_filePath=/home/wumanshu/output
#对外合成音频路径
tts_prefix=192.168.6.22:${server.port}/audio/
#白名单
white_ips=192.168.166.157|192.168.166.158

  application-test.properties:

#语音识别音频文件保存路径
iat_filePath=/home/lulu/input
#语音解析音频文件保存路径
tts_filePath=/home/lulu/output
#对外合成音频路径
tts_prefix=192.168.6.23:${server.port}/audio/
#白名单
white_ips=192.168.166.157|192.168.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="wulinfeng"/>
<property name="LOG_HOME" value="/home/wulinfeng/translate"/>
<Property name="cdr-directory-send" value="/home/wulinfeng/translate/REPORT/send"/>
<Property name="file-suffix" value="%d{yyyyMMdd}"/>
<Property name="pv-type" value="5L"/>
<!-- 配置本机的IP地址,去掉.,每段不足三位的,前端补零 -->
<Property name="ipStr" value=""/>
<!-- 应用端口号,不足五位的前端补零凑够五位 -->
<Property name="portStr" value=""/> <!--格式化输出:%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-</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></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-</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></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=""/>
<!-- 应用端口号,不足五位的前端补零凑够五位 -->
<Property name="portStr" value=""/> <!--格式化输出:%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-</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></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-</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></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=""/>
<!-- 应用端口号,不足五位的前端补零凑够五位 -->
<Property name="portStr" value=""/> <!--格式化输出:%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-</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></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-</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></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/wulinfeng/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/wulinfeng,而你当前应该是在test环境/home/lulu,会提示找不到/home/wulinfeng/logs和/home/wulinfeng/REPORT。

spring boot配置文件、日志配置和代码的多环境配置的更多相关文章

  1. Spring boot 工具类静态属性注入及多环境配置

    由于需要访问MongoDB,但是本地开发环境不能直接连接MongoDB,需要通过SecureCRT使用127.0.0.2本地IP代理.但是程序部署到线上生产环境后,是可以直接访问MongoDB的,因此 ...

  2. spring boot 配置文件properties和YAML详解

    spring boot 配置文件properties和YAML详解 properties中配置信息并获取值. 1:在application.properties配置文件中添加: 根据提示创建直接创建. ...

  3. Spring Boot默认日志logback配置解析

    前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...

  4. Spring Boot 配置文件和命令行配置

    Spring Boot 属于约定大于配置,就是说 Spring Boot 推荐不做配置,很多都是默认配置,但如果想要配置系统,使得软件符合业务定义,Spring Boot 可以通过多种方式进行配置. ...

  5. Spring Boot系列——日志配置

    日志,通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节.但是,这丝毫不影响它在任何一个系统中的重要的地位. 为了保证服务的高可用,发现问题一定要即使,解决问题一定要迅速,所以生 ...

  6. Spring Boot 自定义日志详解

    本节内容基于 Spring Boot 2.0. 你所需具备的基础 什么是 Spring Boot? Spring Boot 核心配置文件详解 Spring Boot 开启的 2 种方式 Spring ...

  7. 【spring boot】8.spring boot的日志框架logback使用

    在继续上一篇的Debug调试之后,把spring boot的日志框架使用情况逐步蚕食. 参考:http://tengj.top/2017/04/05/springbo 开篇之前,贴上完整applica ...

  8. Spring Boot 配置文件中的花样,看这一篇足矣!

    在快速入门一节中,我们轻松的实现了一个简单的RESTful API应用,体验了一下Spring Boot给我们带来的诸多优点,我们用非常少的代码量就成功的实现了一个Web应用,这是传统的Spring应 ...

  9. Spring Boot 配置文件中的花样

    原文:https://www.cnblogs.com/didispace/p/11002732.html 在快速入门一节中,我们轻松的实现了一个简单的RESTful API应用,体验了一下Spring ...

随机推荐

  1. vue-cli2 和vue-cli3

    vue-cli2 和vue-cli3 https://www.cnblogs.com/zhanvo/p/10963776.html <!DOCTYPE html> <html lan ...

  2. 【转】如何在TensorFlow中高效使用数据集

    本文主要记录tensorflow一个比较好用的API:Dataset,feed-dict 是向 TensorFlow 传递信息最慢的方式,应该尽量避免使用.向模型提供数据的正确方式是使用输入管道,这样 ...

  3. 后端token认证模板

    1.创建一个视图 from rest_framework import exceptions from app01 import models from rest_framework.authenti ...

  4. LOJ P10163 Amount of Degrees 题解

    每日一题 day6 打卡 Analysis 题目的意思是找在区间[x,y]之间满足能够由k个b的不同次幂相加得到的数的总数.这题的关键是转换进制,之前几道题我们保存的是数的每位数,其实也就是10进制, ...

  5. CF504E Misha and LCP on Tree 后缀自动机+树链剖分+倍增

    求树上两条路径的 LCP (树上每个节点代表一个字符) 总共写+调了6个多小时,终于过了~ 绝对是我写过的最复杂的数据结构了 我们对这棵树进行轻重链剖分,然后把所有的重链分正串,反串插入到广义后缀自动 ...

  6. Linux FC/iSCSI存储设备管理系列(一):Linux系统设备驱动入门

    Linux FC/iSCSI存储设备管理系列(一):Linux系统设备驱动入门 转载请在文首保留原文出处:EMC中文支持论坛 - https://community.emc.com/go/chines ...

  7. Hdu CRB and Queries(整体二分)

    CRB and Queries Time Limit: 6000 MS Memory Limit: 131072 K Problem Description There are N boys in C ...

  8. visual studio code(vs code) 编译、运行、调试程序(调用g++)

    g++的安装过程忽略,记不清有没有"安装路径不能有空格"这种问题. 网上翻了几个博客,找到的配置文件在g++下都不能运行,遂折腾. 安装vscode与插件 插件为ms-vscode ...

  9. Ubuntu系统下安装完成tomcat进入管理页面

    首先先启动tomcat cd /usr/local/tomcat8. ./bin/startup.sh 然后再打开浏览器 在地址栏中输入 http:/localhost:

  10. Dubbo的SPI是个什么鬼

    原文:https://mp.weixin.qq.com/s/bQc_tASkfsojlcd897kLtA # spi 是啥? spi,简单来说,就是 service provider interfac ...