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

  

  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. frp服务搭建

    安装命令 C wget --no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-install-shell/ma ...

  2. Java8新特性之重复注解(repeating annotations)

    一.什么是重复注解 允许在同一申明类型(类,属性,或方法)的多次使用同一个注解 二.一个简单的例子java 8之前也有重复使用注解的解决方案,但可读性不是很好,比如下面的代码: 复制代码代码如下: p ...

  3. mniGraffle常用快捷键

    OmniGraffle 是 Mac 上的绘图利器.Graffle 在很多方面对标 Windows 系统上的 Microsoft Visio,是制作各种文档的绝妙工具. 变换移动 放大:Cmd+Shif ...

  4. 为LPC1549 LPCXpresso评估板开发基于mbed的项目

    本文将主要介绍如何使用Visual Studio和VisualGDB为LPC1549 LPCXpresso开发板创建一个使用mbed框架的基础项目. LPC1549 LPCXpresso开发板载一个L ...

  5. SQLSERVER视图错位的解决办法

    原始需求如下: 有一个表T1 create table t1 (id int not null primary key ,v1 ) ) ,'aaa'); ,'bbb'); 有一个表TS,用于记录T1中 ...

  6. 小技巧:with用法 pycharm控制台输出带颜色的文字 打印进度条的

    with用法 with用法在python中是一个很独特的用法,因为别的语言的中没有这个用法.所以针对这个特点我们来做一次总结,什么样的情况下可以同with  我们学到的有文件的操作,和acquire  ...

  7. Unable to open debugger port (127.0.0.1:63959): java.net.SocketException "socket closed",编译过来就是无法打开调试器端口,套接字已关闭

    最开始的预测: 这台笔记本操作系统是win10专业工作站版,debug启动项目,provide项目完美启动成功,然后consumer项目报错:Unable to open debugger port ...

  8. http---返回网页(普通,多进程,多线程,协程方式实现)

    代码: import socket import re import multiprocessing import threading import gevent from gevent import ...

  9. Django --- 路由层(urls)

    目录 1.orm表关系如何建立 2.django请求生命周期流程图 3.urls.py路由层 4.路由匹配 5.无名分组 6.有名分组 7.反向解析 8.路由分发 9.名称空间 10.伪静态 11.虚 ...

  10. 使用tippecanoe把GeoJSON制作成供mapbox展示的矢量切片vectortile

    本文记录一下把geojson格式的数据制作成本地的矢量切片,并在mapbox中展示的过程. 1.切片 1.1 矢量数据需要先转换为geojson,如果是shp格式可以使用QGIS或者下载shp2gwo ...