目录
获取数据第三种方式
多环境配置
日志打印
过滤器与拦截器的配置
过滤器配置:
拦截器的配置
全局异常处理器
获取数据第三种方式
数据可能是一个对象形式, 不需要一个一个获取, 定义一个对应的类, 要求属性与yml的数据的二级属性名一样, 使用springboot提供的注解@ConfigurationProperties,进行属性与yml数据的一一映射
多环境配置
三个环境:
开发环境: dev
测试环境: test
生产环境: prod
每个环境不同的配置,分开写, 相同的配置集中.
yml多环境配置:
第一种方式: 单个文件 application.yml的多环境配置
#全局配置文件: application.yml
#共同的配置,写在全局配置文件中
spring:
application:
name: demo4
profiles:
active: prod
#激活某个环境: 使用那个环境
---
# 某个环境的配置文件
#给环境取名字 开发环境: dev
spring:
profiles: dev
#环境的配置
server:
port: 8080
---
# 某个环境的配置文件
#测试环境 test
spring:
profiles: test
server:
port: 9090
---
# 某个环境的配置文件
#生产环境 prod pro
spring:
profiles: prod
server:
port: 80
注意: 在Springboot高版本中, 定义环境名的配置已过时
#低版本 spring: profiles: prod
在高版本变为:
#高版本 spring: config: activate: on-profile: test
第二种方式: 多个yml文件多环境配置
环境配置文件名: application-环境名.yml
Properties类型的配置文件多环境配置
多个properties文件多环境配置
日志打印
默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台
logback,log4j,log4j2 都是同一个人开发, log4j --> log4j2 --> logback(分布式日志)
设置日志输出级别:
第一种方式:
# 开启debug模式,输出调试信息,常用于检查系统运行状况, 自己的日志还是info级别 debug: true
第二种方式:
# 设置日志级别,root表示根节点,即整体应用日志级别 logging: level: root: debug
第三种方式: 推荐
#单独控制某个包下的日志输出级别 #设置整个项目日志输出级别 logging: #设置一个组 group: demo4: com.fs level: root: info #com.fs包的日志输出级别为debug demo4: debug
日志写到控制台, 在开发日志直接打印控制台,但是,测试,生产环境, 日志 保存到日志文件中
第一种方式: 所有的日志保存到一个日志文件:
logging: file: #保存当前项目下 name: suke.log
问题:
- 日志内容大, 打开很慢, 写也慢
- 不方便查找某一天的日志
- 日志无法归档
第二种方式: 每一天产生一个日志文件, 限制每个日志文件大小, 超出,新创建一个文件
对Logback日志专门编写一个配置文件, logback-自定义名.xml 推荐使用名
除了: logback-logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,比如: 如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds" debug="false">
<!-- 日志路径 部署在服务器 文件夹需要设计777权限
linux服务器: 根目录: / 设置目录访问权限
目录不存在,创建目录
-->
<property name="log.base" value="C://logs/suke"/>
<!--日志存储天数-->
<property name="log.max.days" value="30"/>
<!-- 日志文件大小 -->
<property name="log.max.size" value="500MB"/>
<!-- 输出格式-->
<property name="log.pattern" value="%date{ISO8601} %level [%thread] %logger{56} : %msg%n"/>
<!--字符集-->
<property name="log.charset" value="UTF-8"/>
<!--控制台-附加器 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!--格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
</appender>
<!--info-附加器-->
<appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.base}/info/_info.log</file><!--存储路径-->
<!-- 输出格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--按天回滚-->
<fileNamePattern>${log.base}/info/archive/info_%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<!--日志最大存储天数-->
<maxHistory>${log.max.days}</maxHistory>
<!--当天的日志 超过大小 压缩日志并保存 -->
<maxFileSize>${log.max.size}</maxFileSize>
</rollingPolicy>
<!--过滤器,只记录INFO级别的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--warn-附加器-->
<appender name="warnFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.base}/warn/_warn.log</file><!--存储路径-->
<!--输出格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.base}/warn/archive/warn_%d{yyyy-MM-dd}.%i.log.zip
</fileNamePattern>
<!--日志最大存储天数-->
<maxHistory>${log.max.days}</maxHistory>
<!-- 当天的日志 超过大小 压缩日志并保存 -->
<maxFileSize>${log.max.size}</maxFileSize>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--error-附加器-->
<appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.base}/error/_error.log</file><!--存储路径 -->
<!--输出格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.base}/error/archive/error_%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<!--日志最大存储天数-->
<maxHistory>${log.max.days}</maxHistory>
<!-- 当天的日志 超过大小 压缩日志并保存 -->
<maxFileSize>${log.max.size}</maxFileSize>
</rollingPolicy>
<!--级别-过滤器 error-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 为某个包下的所有类的指定Appender 这里也可以指定类名称例如:com.aa.bb.ClassName -->
<!--<logger name="org.springframework.aop.framework.CglibAopProxy" additivity="false">
<level value="info" />
<appender-ref ref="stdout" />
</logger>-->
<logger name="com.fs" additivity="false">
<level value="debug" />
<appender-ref ref="stdout" />
<!--<appender-ref ref="infoFile" />-->
</logger>
<!-- root将级别为“DEBUG”及大于“DEBUG”的日志信息交给已经配置好的名为“Console”的appender处理,“Console”appender将信息打印到Console -->
<root level="info">
<appender-ref ref="stdout" /> <!-- 标识这个appender将会添加到这个logger -->
<appender-ref ref="infoFile" />
<appender-ref ref="warnFile" />
<appender-ref ref="errorFile" />
</root>
</configuration>
- 在application.yml文件中指定logback的配置文件
#指定logback的配置文件 logging: config: classpath:logback-demo4.xml
注意:
spring boot默认会加载classpath:logback-spring.xml或者classpath:logback-spring.groovy或者:classpath:logback.xml
过滤器与拦截器的配置
过滤器配置:
第一种方式: 使用web3.0的注解方式: @WebFilter, javaWeb学习的
需要让我们的springboot扫描这个注解, 以javaWeb的注解:
在启动类, 使用@ServletComponentScan注解
第二种方式: 配置类
@SpringBootConfiguration
public class JavaWebConfig {
//配置过滤器
@Bean
public FilterRegistrationBean<AFilter> configAFilter(){
FilterRegistrationBean<AFilter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
//把过滤器对象设置给FilterRegistrationBean
filterFilterRegistrationBean.setFilter(new AFilter());
//过滤器的配置
//设置过滤器拦截的url
filterFilterRegistrationBean.addUrlPatterns("/*");
//设置过滤器名字
filterFilterRegistrationBean.setName("AFilter");
//设置过滤器的执行顺序
filterFilterRegistrationBean.setOrder(1);
return filterFilterRegistrationBean;
}
}
拦截器的配置
只能通过配置类进行配置
拦截器是属于SpringMVC的技术, SpringBoot 对SpringMVC提供自动配置类,我们不能配置一个springMVC的配置类,替换我们自动配置类,
配置类实现WebMvcConfigurer接口
全局异常处理器
@SpringBootConfiguration
public class MyWebMvcConfigretion implements WebMvcConfigurer {
//配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AInterceptor()).addPathPatterns("/**").excludePathPatterns("/testLog");
}
}
基于AOP的异常增强: @ControllerAdvice
步骤:
1.新建一个全局的异常类
2.在class上添加注解,@ControllerAdvice
3.在class中添加一个方法
4.在方法上添加@ExceptionHandler拦截相应的异常
5.如果返回的是View ---方法的返回值是ModelAndView
6.如果返回的是String或者是JSON数据,那么需要在方法上添加@ResponseBody注解
@ControllerAdvice //Controller的增强类
public class GlobalDefaultExceptionHandler {
//这个方法处理Controller[抛出所有的异常类型
@ExceptionHandler(Exception.class)
public String handleException1(Exception ex){
return ex.getMessage();
}
/* @ExceptionHandler(RuntimeException.class)
public String handleException2(Exception ex){
return ex.getMessage();
}*/
}