Spring Boot - 配置文件

2017-07-30  本文已影响155人  yuanzicheng

1.logging:日志

org.springframework.boot.logging.logback包下提供了默认的logback配置文件base.xml,base.xml还引用了其它3个配置文件。

<?xml version="1.0" encoding="UTF-8"?>

<!--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->

<included>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</included>

Spring Boot支持在application.propertiesapplication.yml中配置logging相关属性,另外它还支持优先使用resources目录下使用logback.xmllogback.groovy,并且不需要任何指定。

logback.xml

<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration debug="false" scan="true" scanPeriod="60 seconds" packagingData="true">
    <!--
    property:用来定义变量值的标签,<property> 有两个属性,name和value。通过<property>定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
    例如使用<property>定义上下文名称,然后在<contentName>设置logger上下文时使用。
    -->
    <property name="contextName" value="demo" />
    <property name="log_home" value="/tmp" />

    <!--
    contextName:每个logger都关联到logger上下文,默认上下文名称为“default”。
    但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
    -->
    <contextName>${contextName}</contextName>

    <!-- ******************** appender:日志目的地 start ******************** -->

    <!-- 标准输出:console -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoder 默认配置为PatternLayoutEncoder -->
        <encoder>
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 文件输出:file -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--<file></file>-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${log_home}/${contextName}%d{yyyyMMdd}.log</FileNamePattern>
        </rollingPolicy>
        <encoder>
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <!--
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
          <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
        -->
    </appender>

    <!-- ******************** appender:日志目的地 end ******************** -->

    <!-- ******************** root:定义日志的level、appender,且最多只能配置一个 start ******************** -->

    <!--TRACE < DEBUG < INFO <  WARN < ERROR-->
    <root>
        <level value="ERROR" />
        <appender-ref ref="file" />
        <appender-ref ref="console" />
    </root>

    <!-- ******************** root:定义日志的level、appender,且最多只能配置一个 end ******************** -->


    <!-- ******************** logger:精确配置package或class的level、appender,可以配置0个或多个 end ******************** -->
    <!--
    level:日志级别(logger中的level会覆盖root中的,即以logger中为准,不管是否向上传递)
    name:包名 或 类的全路径
    addtivity:日志信息是否向上(root)传递
    -->
    <!-- 包名 -->
    <logger name="com.example.demo" />
    <!-- 类的全路径 -->
    <logger name="com.example.demo.DemoApplication" level="warn" additivity="false">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
    </logger>

    <!-- ******************** logger:精确配置package或class日志的level、appender end ******************** -->

</configuration>

不过,既然用了Spring Boot,还是推荐使用application.propertiesapplication.yml来统一配置,因为更简洁。但这种方式有它的局限性,比如日志文件按日期切分、不同级别的日志分开输出等需求就无法实现,期待Spring Boot能更新这个问题,不过还可以用crontab周期性地打包日志文件来变相地实现日志文件切分。

# logging
#全局日志级别
logging.level.root=info
#package下日志级别
logging.level.org.springframework.web=error
logging.level.com.example.demo=info
#文件中日志样式
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
#日志输出文件
logging.file=/tmp/${project}.log

# 自定义
project=demo-dev

2.server:web服务

server相关的配置项非常多,但常用的就少数几个

# server
server.context-path=demo
server.port=8080
server.connection-timeout=30000

3.自定义属性配置

简单属性
Spring Boot支持在application.properties中配置自定义属性,如

name=zhangsan

自定义属性可以在配置文件中引用

${name}

也可以在类中引用,为变量赋值

@Value("${name}")
private String name;

复杂属性
此外,还可以使用@ConfigurationProperties映射复杂的属性

application.yml

userinfo:
  id: 1
  name: 小明

User.java

@ConfigurationProperties(prefix = "userinfo")
@Component
public class User {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

属性引用
另外,各个属性之间可以直接引用,build.gradle中就存在这样的引用:${springBootVersion}

buildscript {
    ext {
        springBootVersion = '1.5.6.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

随机数
Spring Boot可以使用${random}来产生随机的int、long、string字符串

# 随机字符串
random1=${random.value}
# 随机int
random2=${random.int}
# 随机long
random3=${random.long}
# 10以内的随机整数
random4=${random.int(10)}
# 1-10的随机整数
random5=${random.int[1,10]}

最后,要特别注意:自定义属性尽量不要和Spring Boot提供的属性以及操作系统环境变量重名,否则会引起不必要的麻烦。

4.多环境配置文件

我们可以准备多个环境的配置文件,如application-dev.yml、application-pro.yml分别为开发环境和生产环境的配置文件,使用的时候只需要在application.properties中配置如下内容

spring.profiles.active=dev

就可以使用application-dev.yml或application-dev.properties作为配置文件,免去了修改配置文件的麻烦。

此外,Spring Boot会按优先级使用命令行参数操作系统环境变量配置文件中的属性值。那么在生产环境启动应用程序的时候仅需要在命令行后追加环境相关参数即可,配置文件无须做任何修改。

# 指定应用的端口
$ java -jar demo.jar --server.port=8888
# 指定使用application-pro.yml配置文件
$ java -jar demo.jar --spring.profiles.active=pro
上一篇下一篇

猜你喜欢

热点阅读