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。

posted on 2019-08-13 10:06  不想下火车的人  阅读(1131)  评论(0编辑  收藏  举报

导航