spring boot--日志、開發和生產環境切換、自定義配置(環境變量)


 

 


Spring Boot日志常用配置:

復制代碼
# 日志輸出的地址:Spring Boot默認並沒有進行文件輸出,只在控制台中進行了打印
logging.file=/home/zhou
# 日志級別 debug-> info -> warning -> error
# 默認級別為 info
# 如果設置了debug=true的時候,日志級別會自動降低為debug

# ROOT代表默認全局設置
logging.level.ROOT=INFO
# 可以設置指定包的輸出級別,這樣的話,指定的包,級別以下的日志就不在打印或者寫入日志文件
logging.level.org.springframework=ERROR
logging.level.org.apache=ERROR
復制代碼

日志文件默認一天生成一個文件,但是有一個問題,不能分割日志文件。

小項目可以一天生成一個日志文件,但是像淘寶那種級別的可能每分鍾都需要生成一個日志文件,這種情況下,可以使用logback自帶的詳細的配置文件來開發。

注釋掉剛才配置的,把logback.xml文件放到resource目錄下,具體可以去官網:https://logback.qos.ch/

 參考:http://www.cnblogs.com/warking/p/5710303.html

logback.xml示例:

復制代碼
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
    <property name="LOG_HOME" value="/home" />
    <!-- 控制台輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--按pattern指定的路徑格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符,編碼為UTF-8-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!-- 定義一個日滾動(每天生成一份)的日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件輸出的文件名-->
            <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天數-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符,編碼為UTF-8-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 在日滾動文件中,強制只保存錯誤INFO級別以上的信息 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!-- 定義日志全局最低輸出級別,同時向控制台和日滾動文件輸出 -->
    <root level="INFO">
        <appender-ref ref="console" />
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
復制代碼

 參考另一例子:

復制代碼
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
    <property name="LOG_HOME" value="/tmp"/>

    <!-- 彩色日志 -->
    <!-- 彩色日志依賴的渲染類 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(--){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    />

    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <appender name="LOG_INFO"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>
                [%date{yyyy-MM-dd HH:mm:ss.SSS}] [ %-5level] %logger{96} - %msg%n
            </pattern>

            <charset>UTF-8</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/info_log_%d{yyyyMMdd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>200 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>2</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <prudent>false</prudent>
    </appender>

    <appender name="LOG_ERROR"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>
                [%date{yyyy-MM-dd HH:mm:ss.SSS}] [ %-5level] %logger{96} - %msg%n
            </pattern>

            <charset>UTF-8</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/error_log_%d{yyyyMMdd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>200 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>2</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <prudent>false</prudent>
    </appender>


    <appender name="Sentry" class="com.getsentry.raven.logback.SentryAppender">
        <dsn>https://c6fb8bf2a380850a514:1867ceb5621c39b2@sentry.wangjing.cn/15</dsn>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>

    <logger name="logback.SentryAppenderIT" level="INFO">
        <appender-ref ref="Sentry"/>
    </logger>

    <root level="INFO">
        <appender-ref ref="Console"/>
        <appender-ref ref="Sentry"/>
        <appender-ref ref="LOG_INFO"/>
        <appender-ref ref="LOG_ERROR"/>
    </root>
</configuration>
復制代碼

 

開發、生產環境切換和自定義配置:

配置文件有properties和yml文件格式,yml格式文件有易讀,易修改,自動分類等優點,可以使用yml格式配置文件(看個人喜好)

application.yml文件示例:

復制代碼
debug: true

server:
  servlet:
    context-path: app1

spring:
  http:
    encoding:
      charset: utf-8
  thymeleaf:
    cache: true
  datasource:
    username: root
    password: root
    url: jdbc:mysql://127.0.0.1:3306/test
    driver-class-name: com.mysql.jdbc.Driver
復制代碼

IDEA開發工具會把開頭相同的, 自動歸類,這樣以后修改的時候,就不用吧配置文件從頭到尾讀一遍,害怕漏了某些配置

如果properties和yml同時存在,以properties文件為准

 

環境配置,dev開發環境和部署環境連接的數據庫地址、debug模式等等都是不同的,為了區分dev開發環境配置和生產環境配置,可以創建兩個yml文件,什么環境使用相應的配置文件:

  • application.yml:公共配置文件,里面可以通過spring.profiles.active=dev來指定使用哪個配置文件
  • application-dev.yml:開發環境配置文件
  • application-prd.yml:生產環境配置文件

注意:

  1. 當公共配置文件application.yml和dev.yml(或prd.yml)同時存在同一個配置的時候,以dev.yml(prd.yml)配置文件為主,
  2. 當配置項只在公共application.yml文件中有的時候,以公共配置為主
  3. 可以把公共配置項放到application.yml中

日志環境配置有點不一樣:

1. 更改默認的logback.xml為logback-spring.xml

  SpringBoot當看到logback-spring.xml文件存在的時候,才會啟動日志的環境切換,而logback.xml文件無法做到

2.在需要切換的環境上,增加springProfile標簽

會根據上面spring.profiles.active指定的值是什么來自動切換

復制代碼
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    
    <!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
    <springProfile name="dev">
        <property name="LOG_HOME" value="/tmp" />
    </springProfile>
    <springProfile name="prd">
        <property name="LOG_HOME" value="/home/log" />
    </springProfile>
    .............................
復制代碼

spring boot自定義配置:

  Spring Boot 內置的配置項遠遠不能支撐我們的程序運行,在項目設計的時候,往往因為擴展性的需要,項目需要預留很多自定義設置項,Spring Boot 允許我們配置自定義選項。

在Spring Boot 中,有兩種方式使用自定義選項

  • @Value單個屬性注入
  • @ConfigurationProperties類型安全加載

1. 首先創建一個config.properties配置文件(properties文件一般都是單獨保存我們的配置文件信息的),簡單的寫幾個自定義信息

復制代碼
app.name=淘寶2號店
app.version=1.0.0
app.description=這是一家盜版的淘寶店
# -連接符說明使用的時候,后面的S要大寫(pageSize)
app.page-size=20
# 是否顯示廣告
app.show-advert=true
app.website=http://www.taobao2.com
復制代碼

2. 注意,我這里使用了中文,properties文件不支持中文,如果想支持中文,需要設置: 

file -> settings -> Editor -> File Encodings ,勾選Transparent native-to-ascii conversion選項

3. 自定義配置信息寫好了,但是程序不知道啥玩意啊,需要程序啟動時,加載配置配置信息

復制代碼
@SpringBootApplication
@PropertySource("classpath:config.properties") // 在入口類啟動時,加載config.properties
public class Test1Application {

    public static void main(String[] args) {
        SpringApplication.run(Test1Application.class, args);
    }

}
復制代碼

4.1:@Value方式: 寫一個controller類,測試是否能讀取到自定義配置信息

復制代碼
package com.htmltest.test1.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class MyController {

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

    @Value("${app.page-size}")
    private Integer pageSize;

    @RequestMapping(value = "/name")
    public String getAppName(){
        return name;
    }
}
復制代碼

搞定!!

現在發現,如果每個Controller類都重復定義一遍,properties里面那么多配置信息,很麻煩,可以使用另外一種方式:

4.2:@ConfigurationProperties方式:創建一個自定義AppConfig類,並且設置set和get方法

復制代碼
package com.htmltest.test1.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component  // 這是一個組件類,寫上這個注解,Spring Boot啟動時會加載它
@ConfigurationProperties(prefix = "app") // 將所有app前綴的屬性,自動賦值給對應的Bean屬性
// 比如:name對應app前綴的app.name賦值,pageSize對應app.page-size賦值
public class AppConfig {

    private String name;
    private Integer pageSize;
    private String description;

    public String getName() {
        return name;
    }

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

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public Boolean getShowAdvert() {
        return showAdvert;
    }

    public void setShowAdvert(Boolean showAdvert) {
        this.showAdvert = showAdvert;
    }

    private String version;
    private Boolean showAdvert;
}
復制代碼

這樣的話,每個Controller類中都可以方便的使用了:

復制代碼
@RestController
public class MyController {


//    @Resource   和 @Autowired功能一樣效果
//    private AppConfig appConfig;

    @Autowired
    private AppConfig appConfig;

    @RequestMapping(value = "/name")
    public String getAppName(){
        return appConfig.getName();
    }
}
復制代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM