在开发的过程中,经常需要面对不同的运行环境(开发环境、测试环境、生产环境、内网环境、外网环境等等),在不同的环境中,相关的配置一般不一样,比如数据源配置、日志文件配置、以及一些软件运行过程中的基本配置。每次在不同环境部署程序时,都需要修改相应的配置文件,使之完成环境的配置。这么做存在一个比较大的问题:每次修改配置非常麻烦,而且配置错误会产生不可预估的影响,比如,在发布生产环境时用的开发环境的配置还好,但如果在开发环境下用生产环境的数据,将会造成生产数据的污染,导致生产环境崩溃。
开始配置
下面以log4j2.xml 日志的不同环境配置为例
项目使用的spring boot + apache编译插件
pom.xml配置:
<project>
...
<profiles>
<profile>
<id>dev</id>
<!-- 默认激活开发配制,使用config-dev.properties来替换设置过虑的资源文件中的${key} -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!--profiles.active是自定义的字段(名字随便起),自定义字段可以有多个-->
<env>dev</env>
<mail.level>OFF</mail.level>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<env>test</env>
<mail.level>ERROR</mail.level>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
<mail.level>ERROR</mail.level>
</properties>
</profile>
</profiles>
<build>
<resources>
<!-- 先指定 src/main/resources下所有文件及文件夹为资源文件 -->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
<!-- 独立设置对log4j2.xml进行过虑,即这些文件中的@key@会被替换掉为真正的值 -->
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>log4j2.xml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<!--apache编译插件-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<skipTests>true</skipTests> <!--默认关掉单元测试 -->
</configuration>
</plugin>
</plugins>
</build>
</project>
log4j2.xml使用占位符 @key@
,编译后将使用不同环境的属性值替换,属性配置在profiles中
<?xml version="1.0" encoding="UTF-8"?>
<!--设置log4j2的自身log级别为warn-->
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,
当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="warn" monitorInterval="30">
<properties>
<!--发送邮件的日志等级,当mail_level=off时不发送-->
<!-- 以下@key@占位符将在编译后被替换 -->
<property name="MAIL_LEVEL">@mail.level@</property>
<property name="PROJECT_NAME">@env@-proj</property>
<property name="LOG_BACK_HOME">./${PROJECT_NAME}-log</property>
</properties>
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<!--开发环境要打印更多,注释点该语句-->
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<!--输出日志的格式-->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level} [%t] %highlight{%l}: %msg%n"/>
</console>
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,
则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileInfo" fileName="${LOG_BACK_HOME}/info.log"
filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<Filters>
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="WARN" onMatch="NEUTRAL" onMismatch="DENY"/>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="[%d{yyyy/MM/dd HH:mm:ss,SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="${LOG_BACK_HOME}/warn.log"
filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${LOG_BACK_HOME}/error.log"
filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="ERROR"/>
<PatternLayout pattern="[%d{yyyy/MM/dd HH:mm:ss,SSS}] [%t] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<!--, -->
<SMTP name="Mail" subject="${PROJECT_NAME} Error Log" to="xxx, " from="xxx"
smtpHost="xxx" smtpPort="25" bufferSize="1024" smtpProtocol="smtp" smtpDebug="false"
smtpPassword="xxx" smtpUsername="xxx">
</SMTP>
<!-- appender to send mails asynchronously -->
<Async name="AsyncMail" >
<appender-ref ref="Mail"/>
</Async>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<!-- 第三方日志系统 -->
<logger name="org.springframework.core" level="info" />
<logger name="org.springframework.beans" level="info" />
<logger name="org.springframework.context" level="info" />
<logger name="org.springframework.web" level="info" />
<logger name="org.jboss.netty" level="warn" />
<logger name="org.apache.http" level="warn" />
<logger name="org.hibernate" level="info" />
<logger name="com.alibaba.druid" level="info" />
<logger name="org.thymeleaf" level="warn" />
<!--<logger name="org.mybatis" level="debug"/>-->
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
<appender-ref ref="AsyncMail" level="${MAIL_LEVEL}"/>
</root>
</loggers>
</configuration>
编译打包,指定环境,-P的参数代表的是<profile>
中的<id>
打包测试服:mvn clean package -Ptest -Dmaven.test.skip=true
打包正式服:mvn clean package -Pprod -Dmaven.test.skip=true
profile的相关介绍(不同的激活方式)
Maven——profile介绍(不同环境配置不同的参数)
https://blog.youkuaiyun.com/szwangdf/article/details/49357301