zoukankan      html  css  js  c++  java
  • 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/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="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}logserror-${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/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。

  • 相关阅读:
    Dockerize a .NET Core application
    Images之管理image
    Images之Dockerfile中的命令2
    Images之Dockerfile中的命令1
    Docker Builders:Builder pattern vs. Multi-stage builds in Docker
    Images之multi-stage builds
    Images之base image
    Images之Dockerfiles
    Docker 开发最佳实践
    Docker 开发概述
  • 原文地址:https://www.cnblogs.com/wuxun1997/p/11344164.html
Copyright © 2011-2022 走看看