一、多Profile文件java
咱们在主配置文件编写的时候文件名能够是:application-{profile}.properties/ymlspring
默认使用application.propertiestomcat
二、yml支持多文档块方式springboot
server: port: 8080 spring: profiles: active: dev ##激活dev配置块 --- server: port: 8081 spring: profiles: dev --- server: port: 8082 spring: profiles: prod
三、激活指定的profileapp
一、在配置文件中指定 spring.profiles.active=dev 二、在JVM参数中激活 -Dspring.profiles.active=dev 三、命令行 java -jar boot-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
springboot启动会扫描一下位置的application.properties或者application.yml文件做为springboot的默认配置文件框架
-file:./config/ -file:./ -classpath:/config/ -classpath:/
以上是按照优先级从高到低的顺序,全部位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容。异步
咱们也能够经过配置spring.config.location来改变默认配置spring-boot
常见的日志框架:JUL JCL Jboss-loggin logback log4j log4j2 slf4jthis
接口抽象层 | 实现 |
---|---|
log4j |
springboot选用SLF4J和logback编码
日志记录方法的调用,不该该直接调用日志的实现类,而是调用日志抽象层里面的方法
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info("Hello World"); } }
a(slf4j+logback): Spring (commons-logging)、Hibernate(jboss-logging)、Mybatis、XXX
统一日志记录,便是是别的框架也一块儿使用SLF4J进行输出
(1)将系统中其余日志框架先排除出去
(2)用中间包来替换原有的日志框架
(3)再来导入slf4j其余的实现,如logback
springboot开发须要添加以下日志依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <version>2.2.1.RELEASE</version> <scope>compile</scope> </dependency>
可是呢,实际开发中咱们不须要直接添加该依赖。
你会发现 spring-boot-starter 其中包含了 spring-boot-starter-logging ,该依赖内容就是 Spring Boot 默认的日志框架 logback 。
总结:
1》springboot底层也是使用了slf4j+logback的方式进行日志记录 2》springboot也把其余的日志都替换成了SLF4J 3》springboot也增长了中间替换包 4》若是咱们要引入其余框架,必定要把这个框架的默认日志依赖移除掉 例如 Spring (默认使用commons-logging) <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
SpringBoot的默认配置写在,org.springframework.boot:spring-boot:2.2.1.RELEASE文件下的logging包中,如base.xml defaults.xml console-appender.xml 和 file-appender.xml等
springboot默认已经配置好了日志
private Logger logger = LoggerFactory.getLogger(SpringBootTest.class); @Test public void testLog(){ logger.trace("this is trace log.."); logger.debug("this is debug log.."); logger.info("this is info log.."); logger.warn("this is warn log.."); logger.error("this is error log.."); }
日志级别由低到高
trace<debug<info<warn<error<fatal
若是设置为 WARN ,则低于 WARN 的信息都不会输出。
能够调整输入日志的级别,springboot默认使用info级别的日志
logging.file ,设置文件,能够是绝对路径,也能够是相对路径。如: logging.file=my.log
logging.path ,设置目录,会在该目录下建立 spring.log 文件,并写入日志内容,如: logging.path=/var/log
若是只配置 logging.file ,会在项目的当前路径下生成一个 xxx.log 日志文件。
若是只配置 logging.path ,在 /var/log 文件夹生成一个日志文件为 spring.log
注:两者不能同时使用,如若同时使用,则只有 logging.file 生效
默认状况下,日志文件的大小达到 10MB 时会切分一次,产生新的日志文件
由于在 springboot默认配置文件file-appender中有以下配置:
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${ROLLING_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern> <maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize> </rollingPolicy>
更改日志级别
logging: # 分割文件设置 超过 10MB就进行分割,最大保留历史 90天 maxFileSize: 10MB maxHistory: 90 level: root: INFO ##这里是用的root级别,即项目的全部日志,咱们也可使用package级别,即指定包下使用相应的日志级别 path: log ##该属性用来配置日志文件的路径 file: springboot.log ##该属性用来配置日志文件名,若是该属性不配置,默认文件名为spring.log pattern: console: ##控制台输入的日志格式 file: ##文件中日志输出格式 ##logging.level.com.lee.boot.dao=WARN 将指定包下的日志级别设置为WARN
日志输出格式:
%d表示日期时间 %thread表示线程名 %-5level级别从左显示5个字符宽度 %logger{50}表示logger名字最长50个字符,不然按照句点分隔 %msg:日志消息 %n是换行符 eg: %d{yyyy-MM-dd HH:mm:ss.SSS} {%thread} %-5level %logger{50} -%msg%n
定义本身的log配置文件
默认配置文件名称:
( 默认的命名规则,而且放在 src/main/resources 下面便可;spring就不使用它默认的配置了)
logging system | customization |
---|---|
logback | logback-spring.xml OR logback.xml等 |
log4j2 | log4j2-spring.xml OR log4j2.xml |
java util logging | logging.properties |
若是你即想彻底掌控日志配置,但又不想用 logback.xml 做为 Logback 配置的名字, application.yml 能够经过 logging.config 属性指定自定义的名字:
logging.config=classpath:logging-config.xml
logback-spring.xml是被springboot识别的
logback.xml是被logback日志框架识别的
因此推荐使用logback-spring.xml
logback-spring.xml可使用springboot的根据test dev prod等环境来配置日志标签
同spring.profiles.active=dev等一同使用(激活环境)
<springProfile name="dev,staging"> ..... </springProfile> <springProfile name="!dev"> ..... </springProfile>
根节点<configuration></configuration>
根节点包含的属性: scan:当此属性设置为 true 时,配置文件若是发生改变,将会被从新加载,默认值为 true 。 scanPeriod:设置监测配置文件是否有修改的时间间隔,若是没有给出时间单位,默认单位是毫秒。 当 scan 为 true 时,此属性生效。默认的时间间隔为1分钟。 debug:当此属性设置为 true 时,将打印出 logback 内部日志信息,实时查看 logback 运行状态。默认值为 false 。
根下面有5个子节点。
5.1)、<root>节点:
root 节点是必选节点,用来指定最基础的日志输出级别,只有一个 level 属性,用于设置打印级别,大小写无关 ,可选以下:TRACE
,DEBUG
,INFO
,WARN
,ERROR
,ALL
,OFF
。 默认是DEBUG。
能够包含零个或多个元素,标识这个appender将会添加到这个loger。
<root level="debug"> <appender-ref ref="console" /> <appender-ref ref="file" /> </root>
5.2)、<contextName>设置上下文名称
每一个logger都关联到logger上下文,默认上下文名称为“default”。但可使用设置成其余名字,用于区分不一样应用程序的记录。一旦设置,不能修改,能够经过 %contextName 来打印日志上下文名称,通常来讲咱们不用这个属性,无关紧要。
<contextName>logback</contextName>
5.3)、 <property>设置变量
用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。经过定义的值会被插入到logger上下文中。定义变量后,可使“${}”来使用变量。
<property name="logback.logdir" value="/Users/inke/dev/log/tomcat"/> <property name="logback.appname" value="app"/>
5.4)、<appender>
appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪一种输出策略,经常使用就是控制台输出策略和文件输出策略。
控制台输出 ConsoleAppender :
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <contextName>logback-demo</contextName> <!--输出到控制台 ConsoleAppender--> <appender name="consoleLog1" class="ch.qos.logback.core.ConsoleAppender"> <!--展现格式 layout--> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d -1 %msg%n</pattern> </layout> </appender> <!--输出到控制台 ConsoleAppender--> <appender name="consoleLog2" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d -2 %msg%n</pattern> </encoder> </appender> <!--指定最基础的日志输出级别--> <root level="INFO"> <!--appender将会添加到这个loger--> <appender-ref ref="consoleLog1"/> <appender-ref ref="consoleLog2"/> </root> </configuration>
能够看到 layout 和 encoder ,均可以将事件转换为格式化后的日志记录,可是控制台输出使用 layout ,文件输出使用 encoder 。
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <contextName>logback-demo</contextName> <!--输出到控制台 ConsoleAppender--> <appender name="consoleLog1" class="ch.qos.logback.core.ConsoleAppender"> <!--展现格式 layout--> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern> <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> </pattern> </layout> <!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> --> </appender> <!--指定最基础的日志输出级别--> <root level="INFO"> <!--appender将会添加到这个loger--> <appender-ref ref="consoleLog1"/> <appender-ref ref="consoleLog2"/> </root> </configuration>
<encoder> 表示对日志进行编码:
%d{HH: mm:ss.SSS}——日志输出时间 %thread——输出日志的进程名字,这在Web应用以及异步任务处理中颇有用 %-5level——日志级别,而且使用5个字符靠左对齐 %logger{36}——日志输出者的名字 %msg——日志消息 %n——平台的换行符
另外一种常见的日志输出到文件,随着应用的运行时间愈来愈长,日志也会增加的愈来愈多,将他们输出到同一个文件并不是一个好办法。 RollingFileAppender 用于切分文件日志:
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--若是只是想要 Info 级别的日志,只是过滤 info 仍是会输出 Error 日志,由于 Error 的级别高, 因此咱们使用下面的策略,能够避免输出 Error 的日志--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--过滤 Error--> <level>ERROR</level> <!--匹配到就禁止--> <onMatch>DENY</onMatch> <!--没有匹配到就容许--> <onMismatch>ACCEPT</onMismatch> </filter> <!--日志名称,若是没有File 属性,那么只会使用FileNamePattern的文件路径规则 若是同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天 的日志更名为今天的日期。即,<File> 的日志都是当天的。 --> <File>${logback.logdir}/info.${logback.appname}.log</File> <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间--> <FileNamePattern>${logback.logdir}/info.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern> <!--只保留最近90天的日志--> <maxHistory>90</maxHistory> <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志--> <!--<totalSizeCap>1GB</totalSizeCap>--> </rollingPolicy> <!--日志输出编码格式化--> <encoder> <charset>UTF-8</charset> <pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern> </encoder> </appender> <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--若是只是想要 Error 级别的日志,那么须要过滤一下,默认是 info 级别的,ThresholdFilter--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>Error</level> </filter> <!--日志名称,若是没有File 属性,那么只会使用FileNamePattern的文件路径规则 若是同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天 的日志更名为今天的日期。即,<File> 的日志都是当天的。 --> <File>${logback.logdir}/error.${logback.appname}.log</File> <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间--> <FileNamePattern>${logback.logdir}/error.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern> <!--只保留最近90天的日志--> <maxHistory>90</maxHistory> <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志--> <!--<totalSizeCap>1GB</totalSizeCap>--> </rollingPolicy> <!--日志输出编码格式化--> <encoder> <charset>UTF-8</charset> <pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern> </encoder> </appender>
若是同时有 <File> 和 <FileNamePattern> ,根据日期分割日志。
若是要区分 Info 和 Error 级别的日志,那么须要使用过滤规则的策略。
5.5)、<loger>
<loger> 用来设置某一个包或者具体的某一个类的日志打印级别、以及指定 <appender> 。 <loger> 仅有一个 name 属性,一个可选的 level 和一个可选的 addtivity 属性。
name :用来指定受此loger约束的某一个包或者具体的某一个类。
level :用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,表明强制执行上级的级别。若是未设置此属性,那么当前loger将会继承上级的级别。
addtivity :是否向上级loger传递打印信息。默认是true。
loger在实际使用的时候有两种状况
第一种:带有 loger 的配置,不指定级别,不指定 appender
logback-spring.xml 增长 loger 配置以下:
<logger name="com.dudu.controller"/> <logger name="com.dudu.controller" /> 将控制 controller 包下的全部类的日志的打印,可是并没用设置打印级别, 因此继承他的上级的日志级别 “info”
没有设置 addtivity ,默认为true,将此 loger 的打印信息向上级传递;
没有设置 appender ,此 loger 自己不打印任何信息。
将 root 的打印级别设置为 “info” ,指定了名字为 “console” 的 appender 。
当执行 com.dudu.controller.LearnController 类的 login 方法时, LearnController 在包com.dudu.controller中,因此首先执行 `` ,将级别为 “info” 及大于 “info” 的日志信息传递给 root ,自己并不打印;
root 接到下级传递的信息,交给已经配置好的名为“console”的 appender 处理, “console” appender 将信息打印到控制台;
第二种:带有多个 loger 的配置,指定级别,指定 appender
ogback-spring.xml 增长 loger 配置以下:
<configuration> <!--logback.LogbackDemo:类的全路径 --> <logger name="com.lee.controller.LearnController" level="WARN" additivity="false"> <appender-ref ref="console"/> </logger> </configuration>
控制 com.lee.controller.LearnController 类的日志打印,打印级别为“ WARN ”;
additivity 属性为 false ,表示此 loger 的打印信息再也不向上级传递;
第一个
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds"> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-M-d HH:mm:ss} %t %p %m%n</pattern> </encoder> </appender> <appender name="springboot" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- <Encoding>UTF-8</Encoding> --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>logs/logback/springboot_%d{yyyy-M-d}.log </FileNamePattern> <MaxHistory>10</MaxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-M-d HH:mm:ss} %t %p %m%n</pattern> </encoder> </appender> <appender name="redpigmall" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>logs/logback/redpigmall_%d{yyyy-M-d}.log </FileNamePattern> <MaxHistory>10</MaxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-M-d HH:mm:ss} %t %p %m%n</pattern> </encoder> </appender> <logger name="org.springframework.boot" level="debug" additivity="false"> <appender-ref ref="springboot" /> </logger> <!-- name包必须可以扫描到因此类,包括启动类 --> <logger name="com.redpigmall" level="debug" additivity="false"> <appender-ref ref="redpigmall" /> </logger> <root level="debug"> <appender-ref ref="stdout" /> </root> </configuration>
第二个
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!--滚动记录文件--> <appender name="eas" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>/Users/air/Desktop/project/project_my/logs/eas_log/eas.log</File> <!--滚动策略:按天生成日志,并自动压缩--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/Users/air/Desktop/project/project_my/logs/eas_log/eas.log.%d{yyyy-MM-dd}.gz</fileNamePattern> <append>true</append> <maxHistory>10</maxHistory> </rollingPolicy> <encoder> <pattern>[%d{HH:mm:ss.SSS}][%p][%c{40}][%t] %m%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <!--滚动记录文件--> <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>/Users/air/Desktop/project/project_my/logs/eas_log/error.log</File> <!--滚动策略:按天生成日志,并自动压缩--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/Users/air/Desktop/project/project_my/logs/eas_log/error.log.%d{yyyy-MM-dd}.gz</fileNamePattern> <append>true</append> <maxHistory>10</maxHistory> </rollingPolicy> <encoder> <pattern>[%d{HH:mm:ss.SSS}][%p][%c{40}][%t] %m%n</pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!--将日志输出到控制台,要具体控制哪些类要输出日志则用logger标签控制--> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoding>UTF-8</encoding> <encoder> <pattern>[%d{HH:mm:ss.SSS}][%p][%c{40}][%t] %m%n</pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> </appender> <root level="DEBUG"> <appender-ref ref="console"/> <appender-ref ref="error"/> </root> <!--打印cn.xqd.eas包下的内容,日志级别为INFO--> <logger name="cn.xqd.eas" additivity="false" level="INFO" > <appender-ref ref="eas" /> <appender-ref ref="console"/> </logger> <!--打印cn.xqd.eas.mapper包下的内容,即Mybatis相关日志信息,日志级别为DEBUG--> <logger name="cn.xqd.eas.dao" level="DEBUG"/> </configuration>