SpringBoot⽇志配置⽅法(超详细)
默认⽇志 Logback :
默认情况下,Spring Boot会⽤Logback来记录⽇志,并⽤INFO级别输出到控制台。在运⾏应⽤程序和其他例⼦时,你应该已经看到很多INFO级别的⽇志了。
从上图可以看到,⽇志输出内容元素具体如下:
时间⽇期:精确到毫秒
⽇志级别:ERROR, WARN, INFO, DEBUG or TRACE
进程ID
分隔符:— 标识实际⽇志的开始
线程名:⽅括号括起来(可能会截断控制台输出)
Logger名:通常使⽤源代码的类名
⽇志内容
添加⽇志依赖
假如maven依赖中添加了 spring-boot-starter-logging :
1 2 3 4<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId> </dependency>
但是呢,实际开发中我们不需要直接添加该依赖。
上海什么时候可以摘星你会发现 spring-boot-starter 其中包含了 spring-boot-starter-logging ,该依赖内容就是 Spring Boot 默认的⽇志框架 logback 。⼯程中有⽤到了 Thymeleaf ,⽽ Thymeleaf 依赖包含了 spring-boot-starter ,最终我只要引⼊ Thymeleaf 即可。
1 2 3 4<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
控制台输出
⽇志级别从低到⾼分为:
1TRACE < DEBUG < INFO < WARN < ERROR < FATAL 。
如果设置为 WARN ,则低于 WARN 的信息都不会输出。
Spring Boot 中默认配置 ERROR 、 WARN 和 INFO 级别的⽇志输出到控制台。
您还可以通过启动您的应⽤程序 --debug 标志来启⽤“调试”模式(开发的时候推荐开启),以下两种⽅式皆可:
在运⾏命令后加⼊ --debug 标志,如: $ java -jar springTest.jar --debug
在 application.properties 中配置 debug=true ,该属性置为 true 的时候,核⼼ Logger (包含嵌⼊式容器、hibernate、spring)会输出更多内容,但是你⾃⼰应⽤的⽇志并不会输出为 DEBUG 级别。
如果每次都写这⾏代码会很⿇烦,可以使⽤注解,但是需要使⽤ lombok :
添加依赖:
1 2//注解
compile 'org.projectlombok:lombok:1.16.18'安装 lombok 的插件:
1 2 3 4 5Go to File > Settings > Plugins Click on Browse repositories…Search for Lombok Plugin Click on Install plugin Restart Android Studio
允许注解处理,Settings -> Compiler -> Annotation Processors
可以使⽤ {} 占位符来拼接字符串,⽽不需要使⽤ ““+”” 来连接字符串。
⽂件输出
默认情况下,Spring Boot将⽇志输出到控制台,不会写到⽇志⽂件。
使⽤ Spring Boot 喜欢在 application.properties 或 l 配置,这样只能配置简单的场景,保存路径、⽇志格式等,复杂的场景(区分 info 和 error 的⽇志、每天产⽣⼀个⽇志⽂件等)满⾜不了,只能⾃定义配置,下⾯会演⽰。
默认会在设置的 path ⽣成⼀个 spring.log ⽂件。
如果要编写除控制台输出之外的⽇志⽂件,则需在 application.properties 中设置 logging.file 或 logging.path 属性。
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 时会切分⼀次,产⽣新的⽇志⽂件,默认级别为: ERROR、WARN、INFO
级别控制
所有⽀持的⽇志记录系统都可以在 Spring 环境中设置记录级别(例如在 application.properties 中)
格式为: 'logging.level.* = LEVEL'
logging.level :⽇志级别控制前缀,*为包名或Logger名
LEVEL :选项 TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
举例:
logging.level.dudu=DEBUG:com.dudu包下所有class以DEBUG级别输出
=WARN:root⽇志以WARN级别输出
⾃定义⽇志配置
根据不同的⽇志系统,你可以按如下规则组织配置⽂件名,就能被正确加载:
Logback: l, vy, l, vy
Log4j: log4j-spring.properties, l, log4j.properties, l
Log4j2: l, l
JDK (Java Util Logging): logging.properties
Spring Boot 官⽅推荐优先使⽤带有 -spring 的⽂件名作为你的⽇志配置(如使⽤ l ,⽽不是 l ),命名为l 的⽇志配置⽂件, spring boot 可以为它添加⼀些 spring boot 特有的配置项(下⾯会提到)。
默认的命名规则,并且放在 src/main/resources 下⾯即可
如果你即想完全掌控⽇志配置,但⼜不想⽤ l 作为 Logback 配置的名字, l 可以通过 fig 属性指定⾃定义的名字:
虽然⼀般并不需要改变配置⽂件的名字,但是如果你想针对不同运⾏时 Profile 使⽤不同的⽇志配置,这个功能会很有⽤。
⼀般不需要这个属性,⽽是直接在 l 中使⽤ springProfile 配置,不需要 fig 指定不同环境使⽤不同配置⽂件。springProfile 配置在下⾯介绍。
根节点包含的属性
今日92油价多少钱一升scan:当此属性设置为 true 时,配置⽂件如果发⽣改变,将会被重新加载,默认值为 true 。
会计工作流程scanPeriod:设置监测配置⽂件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当 scan 为 true 时,此属性⽣效。
默认的时间间隔为1分钟。
debug:当此属性设置为 true 时,将打印出 logback 内部⽇志信息,实时查看 logback 运⾏状态。默认值为 false 。
根节点 <configuration> 有5个⼦节点,下⾯⼀⼀会详细介绍。
⼦节点⼀ <root>
root节点是必选节点,⽤来指定最基础的⽇志输出级别,只有⼀个level属性。
level:⽤来设置打印级别,⼤⼩写⽆关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。
默认是DEBUG。
可以包含零个或多个元素,标识这个appender将会添加到这个loger。
1 2 3 4<root level="debug">
<appender-ref ref="console"/> <appender-ref ref="file"/>
</root>
⼦节点⼆: <contextName> 设置上下⽂名称
每个logger都关联到logger上下⽂,默认上下⽂名称为“default”。但可以使⽤设置成其他名字,⽤于区分不同应⽤程序的记录。⼀旦设置,不能修改,可以通过 %contextName 来打印⽇志上下⽂名称,⼀般来说我们不⽤这个属性,可有可⽆。
1<contextName>logback</contextName>
⼦节点三: <property> 设置变量
⽤来定义变量值的标签,有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插⼊到logger上下⽂中。定义变量后,可以使“${}”来使⽤变量。
1 2<property name="logback.logdir"value="/Users/inke/dev/log/tomcat"/> <property name="logback.appname"value="app"/>
⼦节点四: <appender>
appender⽤来格式化⽇志输出节点,有俩个属性name和class,class⽤来指定哪种输出策略,常⽤就是控制台输出策略和⽂件输出策略。控制台输出 ConsoleAppender :
⽰例⼀:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23<?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.ConsoleAppender"> <!--展⽰格式 layou
t-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d -1%msg%n</pattern>
</layout>
</appender>
<!--输出到控制台 ConsoleAppender-->
<appender name="consoleLog2"class="ch.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 。⽰例⼆:
1
2
3<?xml version="1.0"encoding="UTF-8"?>
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24<configuration scan="true"scanPeriod="60 seconds"debug="false">
<contextName>logback-demo</contextName>
<!--输出到控制台 ConsoleAppender-->
<appender name="consoleLog1"class="ch.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>
输出⽇志:
1 2 3 4 518:15:22.148logback-demo [http-nio-9010-exec-1] ller.UserContorller - ⽇志输出 info 18:15:22.148logback-demo [http-nio-9010-exec-1] ller.UserContorller - ⽇志输出 warn 18:15:22.148logback-demo [http-nio-9010-exec-1] ller.UserContorller - ⽇志输出 error 18:15:22.148logback-demo [http-nio-9010-exec-1] ller.UserContorller - name:inke , age:33 18:15:22.149logback-demo [http-nio-9010-exec-1] ller.UserContorller - name:inke , age:33
<encoder> 表⽰对⽇志进⾏编码:
%d{HH: mm:ss.SSS}——⽇志输出时间
%thread——输出⽇志的进程名字,这在Web应⽤以及异步任务处理中很有⽤
%-5level——⽇志级别,并且使⽤5个字符靠左对齐
%logger{36}——⽇志输出者的名字
%msg——⽇志消息
%n——平台的换⾏符
ThresholdFilter为系统定义的,例如我们⽤ThresholdFilter来过滤掉ERROR级别以下的⽇志不输出到⽂件中。如果不⽤记得注释掉,不然你控制台会发现没⽇志~
输出到⽂件 RollingFileAppender
满江红怒发冲冠另⼀种常见的⽇志输出到⽂件,随着应⽤的运⾏时间越来越长,⽇志也会增长的越来越多,将他们输出到同⼀个⽂件并⾮⼀个好办法。RollingFileAppender ⽤于切分⽂件⽇志:
1
2
3
4
5
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23<appender name="fileInfoLog"class="ch.olling.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.olling.TimeBasedRollingPolicy">
<!--⽂件路径,定义了⽇志的切分⽅式——把每⼀天的⽇志归档到⼀个⽂件中,以防⽌⽇志填满整个磁盘空间--> <FileNamePattern>${logback.logdir}/info.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--只保留最近90天的⽇志-->
<maxHistory>90</maxHistory>
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 <!--⽤来指定⽇志⽂件的上限⼤⼩,那么到了这个值,就会删除旧的⽇志-->
<!--<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.olling.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.olling.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 级别的⽇志,那么需要使⽤过滤规则的策略,代码注释写的很清楚了。
⼦节点五 <loger>
<loger> ⽤来设置某⼀个包或者具体的某⼀个类的⽇志打印级别、以及指定 <appender> 。 <loger> 仅有⼀个 name 属性,⼀个可选的 level 和⼀个可选的 addtivity 属性。
name :⽤来指定受此loger约束的某⼀个包或者具体的某⼀个类。
level :⽤来设置打印级别,⼤⼩写⽆关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有⼀个特俗值INHERITED或者同义词NULL,代表强制执⾏上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
addtivity :是否向上级loger传递打印信息。默认是true。
loger在实际使⽤的时候有两种情况
先来看⼀看代码中如何使⽤
1
2
3 4 5 6 7 8 9 10 11 12 13 14 15 16package ller;
@Controller
public class LearnController {
private Logger logger = Class());
@RequestMapping(value = "/login",method = RequestMethod.POST)
@ResponseBody
public Map<String,Object> login(HttpServletRequest request, HttpServletResponse response){
//⽇志级别从低到⾼分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出。 ace("⽇志输出 trace");
logger.debug("⽇志输出 debug");
logger.info("⽇志输出 info");
logger.warn("⽇志输出 warn");
<("⽇志输出 error");
Map<String,Object> map =new HashMap<String,Object>();
String Parameter("userName");
String Parameter("password");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论