目录
一、配置文件
-
多个配置文件
#修改tomcat的配置
server.port=8089
server.tomcat.uri-encoding=utf-8
#多个配置文件
spring.profiles.active=dev
-
自定义文件
SpringBoot新建工程的时候默认生成了application.properties文件,此文件可以自定义一些我们需要使用的配置参数,也可以用来修改springboot默认的参数。还有一种是已yml为后缀的配置文件。
#自定义属性
tcp.switch=true
新建RestController,实现restful接口,然后浏览器中验证自定义的参数
package com.mhm.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*
* Created by MHm on 2018/8/7.
*/
@RestController
public class AlarmController {
@Value("${tcp.switch}")
private String tswitch;
@RequestMapping(value = "/alarmSwitch")
public String isSwitch(){
return tswitch;
}
}
运行java程序, 浏览器中输入restful接口的地址http://localhost:8089/alarmswitch
二、日志配置
-
默认日志配置
SpringBoot默认使用的是logback的日志
#日志配置
logging.level.root=debug
代码中增加日志
上面的代码中总是需要增加这样的代码,可以使用注解的方式替换,需要安装lombok插件
private final static Logger logger = LoggerFactory.getLogger(AlarmController.class);
增加lombok的依赖,Reimport。
<!--日志注解-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<optional>true</optional>
</dependency>
-
自定义日志配置
日常的项目中为了好扩展,基本上使用自定义的日志配置文件去配置
logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
log4j2:log4j2-spring.xml, log4j2.xml
推荐使用*-spring.*的配置方式,如果是springboot制定的文件名则不需要初始化,其他的需要初始化
- logback-spring.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="true">
<contextName>springbootdemo1</contextName>
<property name="log.path" value="./logs/" />
<substitutionProperty name="log.proj" value="${project.artifactId}" />
<substitutionProperty name="log.base" value="logs/${log.proj}" />
<substitutionProperty name="max.size" value="100MB" />
<substitutionProperty name="total.size" value="100MB" />
<jmxConfigurator />
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg [%thread] %n</pattern>
</encoder>
<!-- <layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
</layout>-->
</appender>
<!--输出到文件-->
<appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.proj}_info.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>${total.size}</totalSizeCap>
</rollingPolicy>
<!--<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>${log.base}/${log.proj}_info.%i.gz</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>20</maxIndex>
</rollingPolicy>-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>${max.size}</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg [%thread] %n</pattern>
</encoder>
</appender>
<appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.proj}_error.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>${total.size}</totalSizeCap>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>${max.size}</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg [%thread] %n</pattern>
</encoder>
</appender>
<logger name="com.mhm.dao.mapper" level="debug" additivity="true">
<appender-ref ref="console"/>
</logger>
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="infoFile" />
<appender-ref ref="errorFile" />
</root>
</configuration>
log4j2的配置,需要去掉spring-boot-starter-logging的依赖,增加log4j2的依赖。
<!--去除 spring-boot-starter-logging -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
手动添加log4j2的依赖,如果有springboot版本的冲突,可以直接饮用log4j2的jar包。
<!-- log4j2 start -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<!-- log4j2 end -->
- log4j2-spring.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error" monitorInterval="30">
<properties>
<property name="fileName">./log</property>
<property name="fileSize">50MB</property>
</properties>
<!--先定义所有的appender -->
<appenders>
<!--这个输出控制台的配置 -->
<Console name="stdout" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<!--这个都知道是输出日志的格式 -->
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} %5p - %m - %class{36}.%M(%F:%L) [%t:%r]%n"/>
</Console>
<!--Debug 日志配置 -->
<RollingFile name="D" fileName="${fileName}/log111_debug.log"
filePattern="${fileName}/$${date:yyyy-MM}/log_debug-%d{MM-dd-yyyy}-%i.log.gz">
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} %5p - %m (%class{36}.%M:%L) [%t:%r]%n"/>
<SizeBasedTriggeringPolicy size="${fileSize}"/>
</RollingFile>
<!--INFO 日志配置 -->
<RollingFile name="I" fileName="${fileName}/log111_info.log"
filePattern="${fileName}/$${date:yyyy-MM}/log_info-%d{MM-dd-yyyy}-%i.log.gz">
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} %5p - %m (%class{36}.%M:%L) [%t:%r]%n"/>
<SizeBasedTriggeringPolicy size="${fileSize}"/>
</RollingFile>
<!--ERROR 日志配置 -->
<RollingFile name="E" fileName="${fileName}/log111_error.log"
filePattern="${fileName}/$${date:yyyy-MM}/log_error-%d{MM-dd-yyyy}-%i.log.gz">
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} %5p - %m (%class{36}.%M:%L) [%t:%r]%n"/>
<SizeBasedTriggeringPolicy size="${fileSize}"/>
</RollingFile>
</appenders>
<loggers>
<logger name="org" level="error" additivity="false">
<appender-ref ref="E"/>
</logger>
<logger name="freemarker" level="error" additivity="false">
<appender-ref ref="E"/>
</logger>
<logger name="com.opensymphony" level="error" additivity="false">
<appender-ref ref="E"/>
</logger>
<!-- <logger name="org.springframework" level="error" additivity="false">
<appender-ref ref="E"/>
</logger>
<logger name="o.a.k.clients" level="error" additivity="false">
<appender-ref ref="E"/>
</logger>
<logger name="o.apache.catalina" level="error" additivity="false">
<appender-ref ref="E"/>
</logger>
<logger name="o.a.c.c.C" level="error" additivity="false">
<appender-ref ref="E"/>
</logger>-->
<root level="debug" includeLocation="true">
<appender-ref ref="D"/>
<appender-ref ref="stdout"/>
<appender-ref ref="I"/>
<appender-ref ref="E"/>
</root>
</loggers>
</configuration>
代码演示
package com.mhm.controller;
import lombok.extern.log4j.Log4j2;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by MHm on 2018/8/7.
*/
@Log4j2
@RestController
public class CarController {
@RequestMapping(value = "/car")
public String isSwitch(){
log.trace("log4j2 trace");
log.debug("log4j2 debug");
log.info("log4j2 info");
log.warn("log4j2 warn");
log.error("log4j2 error");
return "";
}
}
原因结果
三、小结
思考问题:
1、springboot配置文件的加载顺序。
2、源码下载