spring boot配置文件、日志配置和代码的多环境配置
一般项目都逃不掉开发、测试和生产这三套环境,如果每次给这三套环境打包都去改配置,累死不说,还一不留心就出差错。倒不如每套环境各给一套配置来的轻松。上代码:
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配置文件、日志配置和代码的多环境配置的更多相关文章
- Spring boot 工具类静态属性注入及多环境配置
由于需要访问MongoDB,但是本地开发环境不能直接连接MongoDB,需要通过SecureCRT使用127.0.0.2本地IP代理.但是程序部署到线上生产环境后,是可以直接访问MongoDB的,因此 ...
- spring boot 配置文件properties和YAML详解
spring boot 配置文件properties和YAML详解 properties中配置信息并获取值. 1:在application.properties配置文件中添加: 根据提示创建直接创建. ...
- Spring Boot默认日志logback配置解析
前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...
- Spring Boot 配置文件和命令行配置
Spring Boot 属于约定大于配置,就是说 Spring Boot 推荐不做配置,很多都是默认配置,但如果想要配置系统,使得软件符合业务定义,Spring Boot 可以通过多种方式进行配置. ...
- Spring Boot系列——日志配置
日志,通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节.但是,这丝毫不影响它在任何一个系统中的重要的地位. 为了保证服务的高可用,发现问题一定要即使,解决问题一定要迅速,所以生 ...
- Spring Boot 自定义日志详解
本节内容基于 Spring Boot 2.0. 你所需具备的基础 什么是 Spring Boot? Spring Boot 核心配置文件详解 Spring Boot 开启的 2 种方式 Spring ...
- 【spring boot】8.spring boot的日志框架logback使用
在继续上一篇的Debug调试之后,把spring boot的日志框架使用情况逐步蚕食. 参考:http://tengj.top/2017/04/05/springbo 开篇之前,贴上完整applica ...
- Spring Boot 配置文件中的花样,看这一篇足矣!
在快速入门一节中,我们轻松的实现了一个简单的RESTful API应用,体验了一下Spring Boot给我们带来的诸多优点,我们用非常少的代码量就成功的实现了一个Web应用,这是传统的Spring应 ...
- Spring Boot 配置文件中的花样
原文:https://www.cnblogs.com/didispace/p/11002732.html 在快速入门一节中,我们轻松的实现了一个简单的RESTful API应用,体验了一下Spring ...
随机推荐
- Opencv---零碎记录
OpenCV支持CPU和OpenCL推断,但OpenCL只支持Intel自家GPU,Satya设置了CPU推断模式(cv.dnn.DNN_TARGET_CPU) https://docs.opencv ...
- python高级特性-sorted()
1.数字排序 >>> sorted([1,-12,13,-4],key=abs) [1, -4, -12, 13] 2.字符串排序 按ASCII排序 默认情况下,对字符串排序,是按照 ...
- 第七届蓝桥杯C/C++程序设计本科B组决赛 ——机器人塔(程序大题)
机器人塔 X星球的机器人表演拉拉队有两种服装,A和B.他们这次表演的是搭机器人塔. 类似: A B B A B A A A B B B B B A BA B A B B A 队内的组塔规则是: A 只 ...
- bloomberg bulkfile【一】 文件的分类
文章导航 bloomberg bulkfile [一] 文件的分类 bloomberg bulkfile [二] 文件解析 bloomberg bulkfile [三] 在oracle的存储 订 ...
- unittest单元测试笔记
单元测试 unittest单元测试是基于java的JUnit思想框架开发出来的测试框架 import unittest import HTMLTestRunner class Mytest1(unit ...
- python_面向对象——属性方法property
1.属性方法 class Student(object): def __init__(self,name): self.name = name @property #属性方法:把一个方法变成一个静态的 ...
- 云计算(2)-Cloud是什么
Cloud是什么 compute cycles应建立在data center的附近而不是data center围绕着compute cycles Two kinds of clouds Example ...
- machine learning(12) -- classification: One-vs-all classfication
Multiclass classification例子: 邮箱的邮件的分类: 工作邮件,私人邮件,朋友的邮件,兴趣爱好的邮件 医学诊断: 没有生病,患有流感,患有普通感冒 天气: 晴天,兩,多云等 O ...
- 分布式版本控制工具Git
一.Git技术简介 Git是一个分布式版本控制系统,与集中式的SVN不同. 1. 主要特点 集中式特点: 所有人的资源全部保存在中央服务器. 所有人开发前都需要从中央服务器上下载同步其他人的代码才能继 ...
- codeforces#572Div2 D1---Add On A Tree【思维】
题目:http://codeforces.com/contest/1189/problem/D1 题意:给定一棵树,可以选择任意两个叶子节点对他们的路径增加一定的权值. 问对于给定的这棵树,是否可以得 ...