文章目录
- 1、概念
- 2、相关依赖
- 3、基于springboot的日志搭建
- 3.1、yml或properties 配置
- 3.2、 logback-spring.xml 详解
- 3.2.1、appender 解析
- 3.2.1.1、ConsoleAppender-控制台打印
- 3.2.1.2、FileAppender-日志输出到文件
- 3.2.1.3、RollingFileAppender-滚动记录并输出文件
- 3.2.1.4、file-日志名称和路径
- 3.2.1.5、rollingPolicy-日志行为
- 3.2.1.6、encoder-日志格式化
- 3.2.1.7、filter-过滤器
- 3.2.2、logger 解析
- 3.2.3、root 解析
- 4、logback.xml实例
1、概念
Logback是一个开源日志组件,同时也是 log4j 项目的后续版本,取代了log4j后续的地位。
Logback效率高、适应诸多的运行环境,同时logback 对SLF4J 进行了实现,天然支持 SLF4J。
Logback很灵活,架构通用性强,同时也是 SpringBoot 的内置日志框架。
Logback分为三个模块:logback-core、logback-classic、logback-access。
Logback-core是Logback日志的基础模块。
Logback-classic模块是log4j的改进版本。它本身实现了SLF4J API,所以使用它可以和log4j进行灵活的切换。
logback-access模块集成了Servlet容器,以便实现HTTP访问日志功能。
2、相关依赖
logback所需要的依赖
<dependency> <groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId>
</dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId>
</dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId>
</dependency>
springboot兼容logback,默认集成这些依赖。
spring-boot-starter其中包含了 spring-boot-starter-logging,该依赖内容就是 Spring Boot 默认的日志框架Logback+SLF4J。
spring-boot-starter-web 包含了spring-boot-starte。
所以我们只需要引入spring-boot-starter-web就可以了。
我们下面的解析基于springboot实现。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
3、基于springboot的日志搭建
3.1、yml或properties 配置
属性 | 描述 |
---|---|
logging.file | 日志文件名 |
logging.path | 日志文件路径,可以是相对路径,也可以是绝对路径 |
logging.config | logback配置文件的路径 |
logging.level.包名 | 指定包名下面的日志级别 |
- classpath:表示当前服务Resources目录下
- spring.application.name:表示当前服务名称
- level.mybatis=debug:表示mybatis包下面打印日志的级别为debug
logging:config: classpath:logback-spring.xmlfile: ${spring.application.name}path: ../logs/level:mybatis: debug
3.2、 logback-spring.xml 详解
logback的配置文件有三个主要的标签:
- appender
- logger:设置某一个包或者具体的某一个类的日志打印级别、以及指定appender。它只有一个name属性,level、addtivity是可选属性。
- root:属于根logger。它其实也是一个logger,只不过已经被默认命名为root。
level属性设置打印级: TRACE、DEBUG、INFO、WARN、ERROR、ALL、 OFF,默认是DEBUG。
如果上面的logger没有设置level属性, 则继承root的属性
3.2.1、appender 解析
负责写日志的组件, 用来设置日志的输出位置, 日志文件的生成策略等
3.2.1.1、ConsoleAppender-控制台打印
把日志打印到控制台
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
...
</appender>
3.2.1.2、FileAppender-日志输出到文件
把日志输出到文件
<appender name="LOG_FILE" class="ch.qos.logback.core.FileAppender">
...
</appender>
3.2.1.3、RollingFileAppender-滚动记录并输出文件
滚动记录,同时把日志输出到文件。
支持日志文件按文件大小、日期拆分
<appender name="LOG_FILE" class="ch.qos.logback.core.rolling.FileAppender">
...
</appender>
3.2.1.4、file-日志名称和路径
被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
- ${LOG_PATH}:yml配置文件中的 logging.path
- ${LOG_FILE}:yml配置文件中的 logging.file
<appender name="LOG_FILE" class="ch.qos.logback.core.rolling.FileAppender">
<file>${LOG_PATH}${LOG_FILE}.log</file>
</appender>
3.2.1.5、rollingPolicy-日志行为
当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。
它的策略一般常用的有两个
- TimeBasedRollingPolicy:表示每天生成新的文件
- SizeAndTimeBasedRollingPolicy:表示每天生成和大小生成同时执行
rollingPolicy下面有三个重要的标签
- fileNamePattern:表示什么周期触发一次生成新的日志文件,也是周期触发后的文件名称。如果它后缀是 .gz 则代表自动压缩
- maxHistory:表示保存日志的最大单位时间
- MaxFileSize:表示每个文件的的大小
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 --><fileNamePattern>${LOG_PATH}${LOG_FILE}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><!-- 每产生一个日志文件,该日志文件的保存期限为30天 --><maxHistory>7</maxHistory><!-- maxFileSize:这是活动文件的大小,默认值是10MB,也可以自己设置 --><MaxFileSize>10MB</MaxFileSize>
</rollingPolicy>
3.2.1.6、encoder-日志格式化
- %d{yyyy-MM-dd}:获取现在的日期并格式化
- %d{HH:mm:ss.SSS}:获取现在的时间并格式化
- %-5level:输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
- %c{1.}:表示显示调用者的时候,只显示包名最后一截及方法名,前面的几段只取首字母
- %L: 表示调用者所在代码的行号
- %msg:表示需要打印的日志信息
- %n: 表示系统换行符
颜色编码:
编码 | 加粗编码 | 描述 |
---|---|---|
%black | 黑色 | |
%red | %boldRed | 红色 |
%green | %boldGreen | 绿色 |
%yellow | %boldYellow | 黄色 |
%blue | %boldBlue | 蓝色 |
%magenta | %boldMagenta | 洋红色 |
%cyan | %boldCyan | 青色 |
%white | %boldWhite | 白色 |
%gray | 灰色 | |
%highlight | 高亮色 |
<encoder><pattern>%d{yyyy-MM-dd} %d{HH:mm:ss.SSS} %green(%-5level) [%blue(%-20.20thread{20})] %cyan(%-36.36logger{36}) : %msg%n</pattern><charset>utf-8</charset>
</encoder>
3.2.1.7、filter-过滤器
使用过滤器可以设置日志的传递。
日志经过各个过滤器进而被抛弃、被打印或者不处理。
- level:过滤级别。参数有 TRACE、DEBUG、INFO、WARN、 ERROR、ALL 、OFF
- onMatch:匹配大于这个级别的日志
- onMismatch:匹配小于于这个级别的日志,可以选的有
onMatch和onMismatch可选参数有:
参数 | 描述 |
---|---|
ACCEPT | 打印 |
DENY | 不打印 |
NEUTRAL | 交给下一个过滤器处理 |
<!-- 日志级别过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>ERROR</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch>
</filter>
3.2.2、logger 解析
设置某一个包或者具体的某一个类的日志打印级别,以及指定appender。
它有三个属性,必选的name,可选的level、addtivity
- name:指定受此loger约束的某一个包或者具体的某一个类。
- level:设置打印级别,参数有 TRACE、DEBUG、INFO、WARN、 ERROR、ALL 、OFF。如果未设置此属性,logger将会继承上级的级别。
- addtivity:是否向上级logger传递打印信息,默认true。
<logger name="com.atomikos.jdbc" level="OFF">
</logger><logger name="com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver" level="OFF">
</logger>
3.2.3、root 解析
root同样也是logger元素,但是它是根logger。只有一个level属性,它默认命名为root。
- level:设置打印级别,参数有 TRACE、DEBUG、INFO、WARN、 ERROR、ALL 、OFF。如果未设置此属性,logger将会继承上级的级别,默认为DEBUG。
如果logger没有设置level属性, 会继承root的属性
<root level="INFO"><appender-ref ref="STDOUT"/>
</root>
4、logback.xml实例
yml配置:
logging:config: classpath:logback-spring.xmlfile: ${spring.application.name}path: ../logs/level:mybatis: debug
xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration><springProperty scope="context" name="app_name" source="spring.application.name"/><include resource="org/springframework/boot/logging/logback/defaults.xml"/><include resource="org/springframework/boot/logging/logback/console-appender.xml"/><jmxConfigurator/><!-- 控制台 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><!-- 日志格式 --><encoder><pattern>%d{yyyy-MM-dd} %d{HH:mm:ss.SSS} %green(%-5level) [%blue(%-20.20thread{20})] %cyan(%-36.36logger{36}) : %msg%n</pattern><charset>utf-8</charset></encoder><!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><!-- 只有这个日志权限才能看,sql语句 --><level>DEBUG</level></filter></appender><appender name="LOG_FILE" class="ch.qos.logback.core.rolling.FileAppender"><file>${LOG_PATH}${LOG_FILE}.log</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 --><fileNamePattern>${LOG_PATH}${LOG_FILE}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><!-- 每产生一个日志文件,该日志文件的保存期限为30天 --><maxHistory>7</maxHistory><!-- maxFileSize:这是活动文件的大小,默认值是10MB,也可以自己设置 --><MaxFileSize>10MB</MaxFileSize></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd} %d{HH:mm:ss.SSS} %green(%-5level) [%blue(%-20.20thread{20})] %cyan(%-36.36logger{36}) : %msg%n</pattern><charset>utf-8</charset></encoder></appender><appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}${LOG_FILE}.log.error</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 --><fileNamePattern>${LOG_PATH}${LOG_FILE}.%d{yyyy-MM-dd}.%i.log.error.gz</fileNamePattern><!-- 每产生一个日志文件,该日志文件的保存期限为30天 --><maxHistory>15</maxHistory><!-- maxFileSize:这是活动文件的大小,默认值是10MB,也可以自己设置 --><MaxFileSize>10MB</MaxFileSize></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd} %d{HH:mm:ss.SSS} %green(%-5level) [%blue(%-20.20thread{20})] %cyan(%-36.36logger{36}) : %msg%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 name="com.atomikos.jdbc" level="OFF"></logger><logger name="com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver" level="OFF"></logger><root level="INFO"><!--<appender-ref ref="STDOUT"/>--><appender-ref ref="LOG_FILE"/><appender-ref ref="ERROR_FILE"/><appender-ref ref="CONSOLE"/></root>
</configuration>