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:生产环境配置文件
注意:
- 当公共配置文件application.yml和dev.yml(或prd.yml)同时存在同一个配置的时候,以dev.yml(prd.yml)配置文件为主,
- 当配置项只在公共application.yml文件中有的时候,以公共配置为主
- 可以把公共配置项放到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();
}
}
spring boot--日志、开发和生产环境切换、自定义配置(环境变量)的更多相关文章
- spring boot + vue + element-ui全栈开发入门——spring boot后端开发
前言 本文讲解作为后端的spring boot项目开发流程,如果您还不会配置spring boot环境,就请点击<玩转spring boot——快速开始>,如果您对spring boot还 ...
- 52. spring boot日志升级篇—log4j多环境不同日志级别的控制【从零开始学Spring Boot】
在上一章节中我们介绍了,仅通过log4j-spring.properties对日志级别进行控制,对于需要多环境部署的环境不是很方便,可能我们在开发环境大部分模块需要采用DEBUG级别,在测试环境可能需 ...
- Spring Boot 利用 nginx 实现生产环境的伪热更新
当我们在服务器部署Java程序,特别是使用了 Spring Boot 生成单一 Jar 文件部署的时候,单一文件为我们开发单来的极大的便利性,保障程序的完整性.但同时对我们修改程序中的任何一处都带来重 ...
- 54. spring boot日志升级篇—logback【从零开始学Spring Boot】
在<44. Spring Boot日志记录SLF4J>章节中有关相关的介绍,这里我们在深入的了解下logback框架. 为什么要使用logback ? --在开发中不建议使用System. ...
- 50. Spring Boot日志升级篇—log4j【从零开始学Spring Boot】
如果你使用的是spring boot 1.4.0版本的话,那么你可能需要配合以下文章进行学习 90.Spring Boot 1.4 使用log4j错误[从零开始学Spring Boot] Log4j是 ...
- Spring Boot 日志各种使用姿势,是时候捋清楚了!
@ 目录 1. Java 日志概览 1.1 总体概览 1.2 日志级别 1.3 综合对比 1.4 最佳实践 2. Spring Boot 日志实现 2.1 Spring Boot 日志配置 2.2 L ...
- spring boot / cloud (十八) 使用docker快速搭建本地环境
spring boot / cloud (十八) 使用docker快速搭建本地环境 在平时的开发中工作中,环境的搭建其实一直都是一个很麻烦的事情 特别是现在,系统越来越复杂,所需要连接的一些中间件也越 ...
- Spring Boot 日志配置方法(超详细)
默认日志 Logback : 默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台.在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了. 从上图 ...
- Spring Boot 日志配置
Spring Boot 日志配置 默认日志 Logback: 默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台.在运行应用程序和其他例子时,你应该已经看到很 ...
随机推荐
- 【转】C++后台开发应该读的书
转载自http://www.cnblogs.com/balloonwj/articles/9094905.html 作者 左雪菲 根据我的经验来谈一谈,先介绍一下我的情况,坐标上海,后台开发(也带团队 ...
- 【贪心】bzoj1592: [Usaco2008 Feb]Making the Grade 路面修整
贪心的经典套路:替换思想:有点抽象 Description FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也 就是说,高度上升与高度下降的路段不能 ...
- Docker 自动运行Nginx容器
Dockerfile文件如下: FROM ubuntu #基础镜像 RUN apt-get update #更新apt RUN apt-get -y install nginx #安装nginx VO ...
- Docker 容器的网络连接 & 容器互联
1. Docker 容器网络基础架构 Docker0 ifconfig查看到的 docker0 是linux的虚拟网桥(OSI数据链路层) docker0 地址划分: 172.17.42.1 255. ...
- 201621123080《Java程序设计》第十一周学习总结
201621123080<Java程序设计>第十一周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 ...
- linux三剑客正则表达式
^:以...开头,^d,意思是以d开头.例如:ls -F(-p) | grep " ^d " $:以...结尾,/$,意思是以/结尾.例如:ls -F(-p) | grep &q ...
- 剑指Offer(书):不用四则运算做加法
题目:写一个函数,求两个整数之和,不得使用四则运算位运算. package com.gjjun.jzoffer; /** * 写一个函数,求两个整数之和,不得使用四则运算 * * @author gj ...
- 虚拟化技术xen,kvm,qemu区别
虚拟化类型 全虚拟化(Full Virtualization) 全虚拟化也成为原始虚拟化技术,该模型使用虚拟机协调guest操作系统和原始硬件,VMM在guest操作系统和裸硬件之间用于工作协调,一些 ...
- 线段树、前缀数组:HDU1591-Color the ball(区间更新、简单题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- Report Server multiple value 多值选择
一.项目需求 今天在做项目的时候,有一个需求,具体如下:在Report Server中存在一个报表,报表中有一个参数doctor_name,该参数允许多值,默认全部.但是由于前端页面医生选择时多选没有 ...