Logback介绍:
Logback是由log4j创始人设计的另一个开源日志组件,大致分为以下三个模块:
logback-core:是其他两个模块的基础模块
logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或
logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
logback内部构造原理介绍:
Logger、appender及layout:
Appender主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、 MySQL、PostreSQL、 Oracle和其他数据库、 JMS和远程UNIX Syslog守护进程等。
Logger作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。
Layout 负责把事件转换成字符串,格式化的日志信息的输出。每个Logger实例都被关联到一个 LoggerContext,LoggerContext负责制造logger,也负责以树结构排列各个logger。其他所有logger也通过org.slf4j.LoggerFactory 类的静态方法getLogger取得。 getLogger方法以 logger名称为参数。用同一名字调用LoggerFactory.getLogger 方法所得到的永远都是同一个logger对象的引用。
Logback级别相关介绍:
有效级别及级别的继承:
每个Logger 可以被分配级别。级别包括:TRACE、DEBUG、INFO、WARN 、ERROR,定义在ch.qos.logback.classic.Level类中。如果 Logger没有被分配级别,那么它将从有被分配级别的最近的祖先那里继承级别。root logger 默认级别是 DEBUG。日志打印的规则:
例如:如果Log是一个Logger实例,那么语句Log.info(“xxxx”)是一个INFO级别的记录语句,那么当Logger实例的有效级别不小于(高于或等于)INFO级别时,该条语句才可能被执行,此时该记录语句状态称为’被启用’ 否则称为’被禁用’。logback核心日志级别的排序:TRACE < DEBUG < INFO < WARN < ERROR
快速上手:
Maven配置项:
<!--logback start-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
<!--end-->
在application.properties同级目录下创建一个logback的配置文件,Springboot默认集成的就logback,,SpringBoot启动时会默认加载在 classpath下的logback-xxxx.xml的文件。如果配置文件 logback-xxx.xml不存在,那么 logback 默认地会调用BasicConfigurator ,创建一个最小化配置。最小化配置由一个关联到根 logger 的ConsoleAppender 组成。输出用模式为%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 进行格式化输出。root logger 默认级别是 DEBUG。
这里我们创建一个logback-spring.xml,内容如下:
<configuration>
<property name="LOG_FOLDER" value="DemoLogs"/>
<property name="LOG_FILE" value="MyDemoApplication"/>
<appender name="MAIN_ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender" >
<file>${LOG_FOLDER}/${LOG_FILE}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_FOLDER}/${LOG_FILE}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<!-- 格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%X{traceId}] [%thread] %-5level %logger - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="ERROR_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender" >
<file>${LOG_FOLDER}/${LOG_FILE}-error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_FOLDER}/${LOG_FILE}-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<!-- 格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%X{traceId}] [%thread] %-5level %logger - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{1000} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<root>
<appender-ref ref="MAIN_ROLLING"/>
<appender-ref ref="ERROR_INFO"/>
<appender-ref ref="STDOUT"/>
</root>
</configuration>
logback配置文件配置项大致介绍:
配置文件的基本结构:以 configuration 开头,后面有零个或多个 appender 元素,有零个或多个 logger 元素,有最多一个 root 元素。
根节点 configuration ,包含下面三个属性:
scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--其他配置省略-->
</configuration>
- 子节点 property :用来定义变量值,它有两个属性name和value,通过 property 定义的值会被插入到logger上下文中,可以使“${}”来使用变量。
name: 变量的名称
value: 的值时变量定义的值
<configuration>
<property name="LOG_FOLDER" value="DemoLogs"/>
<property name="LOG_FILE" value="MyDemoApplication"/>
</configuration>
- 子节点 appender :负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名。
1、常用appender:ch.qos.logback.core.rolling.RollingFileAppender
滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。该标签有以下子节点:
file:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
append :如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
encoder :对日志进行格式化输出;
rollingPolicy :当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类。
<appender name="ERROR_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender" >
<file>${LOG_FOLDER}/${LOG_FILE}-error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${LOG_FOLDER}/${LOG_FILE}-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<!-- 格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%X{traceId}] [%thread] %-5level %logger - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
3、常用appender:
ch.qos.logback.core.ConsoleAppender 把日志输出到控制台,有以下子节点:
target:字符串System.out(默认)或者System.err
encoder:对日志进行格式化输出;
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{1000} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
- 子节点loger:用来设置某一个包或具体的某一个类的日志打印级别、以及指定appender。loger仅有一个name属性,一个可选的level和一个可选的addtivity属性。
可以包含零个或多个appender-ref元素,标识这个appender将会添加到这个loger
name: 用来指定受此loger约束的某一个包或者具体的某一个类。
level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前loger将会继承上级的级别。
addtivity: 是否向上级loger传递打印信息。默认是true。同loger一样,可以包含零个或多个appender-ref元素,标识这个appender将会添加到这个loger。
<appender name="ClassLogInfo" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/ClassLogInfo.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_FOLDER}/ClassLogInfo-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 该类的所有日志的记录信息将会统一在ClassLogInfo文件中统一存储-->
<logger name="com.swagger.demo.controller.SwaggerControllerTest" additivity="true">
<appender-ref ref="ClassLogInfo"/>
</logger>
- 子节点root:它也是loger元素,但是它是loger的根,是所有loger的上级。只有一个level属性,level用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,不能设置为INHERITED或者同义词NULL。 默认是DEBUG。
因为name已经被命名为”root”,且已经是最上级了。
appender-ref:来指定appender可以包含零个或多个子标签appender-ref
注意:加粗字符表示子标签如上:appender-ref表示
<appender-ref>