springboot--⽇志、开发和⽣产环境切换、⾃定义配置(环境变量)
Spring Boot⽇志常⽤配置:
# ⽇志输出的地址:Spring Boot默认并没有进⾏⽂件输出,只在控制台中进⾏了打印
虾仁和什么炒好吃logging.file=/home/zhou
# ⽇志级别 debug-> info -> warning -> error
# 默认级别为 info
cad插入文字
# 如果设置了debug=true的时候,⽇志级别会⾃动降低为debug
# ROOT代表默认全局设置
logging.level.ROOT=INFO
# 可以设置指定包的输出级别,这样的话,指定的包,级别以下的⽇志就不在打印或者写⼊⽇志⽂件
logging.level.springframework=ERROR
logging.level.apache=ERROR
⽇志⽂件默认⼀天⽣成⼀个⽂件,但是有⼀个问题,不能分割⽇志⽂件。
⼩项⽬可以⼀天⽣成⼀个⽇志⽂件,但是像淘宝那种级别的可能每分钟都需要⽣成⼀个⽇志⽂件,这种情况下,可以使⽤logback⾃带的详细的配置⽂件来开发。
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="fal">
<!--定义⽇志⽂件的存储地址勿在 LogBack 的配置中使⽤相对路径-->
<property name="LOG_HOME" value="/home"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.ConsoleAppender">
<encoder class="ch.qos.der.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>
<chart>UTF-8</chart>
</encoder>
</appender>
<!-- 定义⼀个⽇滚动(每天⽣成⼀份)的⽇志⽂件 -->
<appender name="FILE" class="ch.olling.RollingFileAppender">
<rollingPolicy class="ch.olling.TimeBadRollingPolicy">
<!--⽇志⽂件输出的⽂件名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--⽇志⽂件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.der.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>
<chart>UTF-8</chart>
</encoder>
<!-- 在⽇滚动⽂件中,强制只保存错误INFO级别以上的信息 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!--⽇志⽂件最⼤的⼤⼩-->
<triggeringPolicy class="ch.olling.SizeBadTriggeringPolicy">
<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 conds">
<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% />
<appender name="Console" class="ch.ConsoleAppender">
<encoder>
养殖业什么最稳<pattern>${CONSOLE_LOG_PATTERN}</pattern>
大连旅游政务网</encoder>
</appender>
<appender name="LOG_INFO"
class="ch.olling.RollingFileAppender">
<encoder>
<pattern>
[%date{yyyy-MM-dd HH:mm:ss.SSS}] [ %-5level] %logger{96} - %msg%n
</pattern>
<chart>UTF-8</chart>
</encoder>
<rollingPolicy class="ch.olling.TimeBadRollingPolicy">
<fileNamePattern>${LOG_HOME}/info_log_%d{yyyyMMdd}.%i.log</fileNamePattern>
<timeBadFileNamingAndTriggeringPolicy
class="ch.olling.SizeAndTimeBadFNATP">
<maxFileSize>200 MB</maxFileSize>
</timeBadFileNamingAndTriggeringPolicy>
<maxHistory>2</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<prudent>fal</prudent>
</appender>
<appender name="LOG_ERROR"
class="ch.olling.RollingFileAppender">
<encoder>
<pattern>
[%date{yyyy-MM-dd HH:mm:ss.SSS}] [ %-5level] %logger{96} - %msg%n
</pattern>
<chart>UTF-8</chart>
</encoder>
<rollingPolicy class="ch.olling.TimeBadRollingPolicy">
<fileNamePattern>${LOG_HOME}/error_log_%d{yyyyMMdd}.%i.log</fileNamePattern>
<timeBadFileNamingAndTriggeringPolicy
class="ch.olling.SizeAndTimeBadFNATP">
<maxFileSize>200 MB</maxFileSize>
</timeBadFileNamingAndTriggeringPolicy>
<maxHistory>2</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<prudent>fal</prudent>
</appender>
<appender name="Sentry" class="y.raven.logback.SentryAppender">
<dsn>c6fb8bf2a380850a514:1867ceb5621c39b2@ntry.wangjing/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格式配置⽂件(看个⼈喜好)
debug: true
rver:
rvlet:
context-path: app1
spring:
http:
encoding:
chart: utf-8
thymeleaf:
cache: true
datasource:
urname: root
password: root
url: jdbc:mysql://127.0.0.1:3306/test
driver-class-name: sql.jdbc.Driver
IDEA开发⼯具会把开头相同的,⾃动归类,这样以后修改的时候,就不⽤吧配置⽂件从头到尾读⼀遍,害怕漏了某些配置
如果properties和yml同时存在,以properties⽂件为准
环境配置,dev开发环境和部署环境连接的数据库地址、debug模式等等都是不同的,为了区分dev开发环境配置和⽣产环境配置,可以创建两个yml⽂件,什么环境使⽤相应的配置⽂件:
注意:
1. 当公共配置⽂件l和l(或l)同时存在同⼀个配置的时候,以l)配置⽂件为主,
2. 当配置项只在公共l⽂件中有的时候,以公共配置为主
3. 可以把公共配置项放到l中
⽇志环境配置有点不⼀样:
1. 更改默认的l为l
SpringBoot当看到l⽂件存在的时候,才会启动⽇志的环境切换,⽽l⽂件⽆法做到
2.在需要切换的环境上,增加springProfile标签
会根据上⾯spring.profiles.active指定的值是什么来⾃动切换
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="fal">
<!--定义⽇志⽂件的存储地址勿在 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=
2. 注意,我这⾥使⽤了中⽂,properties⽂件不⽀持中⽂,如果想⽀持中⽂,需要设置:
file -> ttings -> 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 ller;
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类,并且设置t和get⽅法
package fig;
import org.t.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 tName(String name) {
this.name = name;
}
public Integer getPageSize() {
return pageSize;
}
public void tPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public String getDescription() {
return description;
}
public void tDescription(String description) {
this.description = description;
}
public String getVersion() {
return version;
}
public void tVersion(String version) {
this.version = version;
}
public Boolean getShowAdvert() {
return showAdvert;
}
public void tShowAdvert(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(){
Name();
}
}