Logback 简介
logback 是继 log4j 后的又一个日志框架,logback 是 springboot 自带的日志框架,logback 以严格的日志级别区分不同级别的日志(其他日志都是继承上一级的日志级别,例如:log4j2,log4j 都是继承更高级别的日志),logback 分为三个模块,logback-core,logback-classic,logback-access。
- logback-core:logback-core 是 logback 的核心模块,是 logback-classic 和的 logback-access 的基础。
- logback-classic:实现了 slf4j API,配合 slf4j 使用,可以方便的切换其他日志框架。
- logback-access:与 Servlet 容器(如 Tomcat 和 Jetty)集成,提供了 HTTP 访问日志接口。
Springboot 集成 logback
之前说过,由于 springboot 自身是集成了 logback,所以,在集成 logback 时只要 springboot 的自身依赖即可。
pom 依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
application.properties 文件的配置
logging.config=classpath:logback-spring.xml
logback-spring.xml 文件配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
<property name="LOG_HOME" value="./WebAppLogs/logs"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化输出:%d 表示日期,%thread 表示线程名,%-5level:级别从左显示 5 个字符宽度 %msg:日志消息,%n 是换行符 -->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
</encoder>
</appender>
<!-- trace 日志 -->
<appender name="RollingFileTrace" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${LOG_HOME}/trace.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 只接受 trace 级别的日志,因为 logback 有严格的日志区分,所以某一个分类的日志只包括该类型的日志 -->
<level>TRACE</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/trace_%d{yyyy-MM-dd-HH}-%i.log.zip</fileNamePattern>
<!-- 单个文件大小 -->
<maxFileSize>10 MB</maxFileSize>
<!--fileNamePattern 的格式为 yyyy-MM-dd-HH, 则日志回收时间也应该与 fileNamePattern 相同 -->
<maxHistory>168</maxHistory>
<!-- 总得文件日志 -->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化输出:%d 表示日期,%thread 表示线程名,%-5level:级别从左显示 5 个字符宽度 %msg:日志消息,%n 是换行符 -->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
<!-- 设置日志编码为 utf-8-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- debug 日志 -->
<appender name="RollingFileDebug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${LOG_HOME}/debug.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/debug_%d{yyyy-MM-dd-HH}-%i.log.zip</fileNamePattern>
<!-- 单个文件大小 -->
<maxFileSize>10 MB</maxFileSize>
<!--fileNamePattern 的格式为 yyyy-MM-dd-HH, 则日志回收时间也应该与 fileNamePattern 相同 -->
<maxHistory>168</maxHistory>
<!-- 总得文件日志 -->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化输出:%d 表示日期,%thread 表示线程名,%-5level:级别从左显示 5 个字符宽度 %msg:日志消息,%n 是换行符 -->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
<!-- 设置日志编码为 utf-8-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- info 日志 -->
<appender name="RollingFileInfo" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${LOG_HOME}/info.log</file>
<!-- 只要 info 的日志的配置 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/info_%d{yyyy-MM-dd-HH}-%i.log.zip</fileNamePattern>
<!-- 单个文件大小 -->
<maxFileSize>10 MB</maxFileSize>
<!--fileNamePattern 的格式为 yyyy-MM-dd-HH, 则日志回收时间也应该与 fileNamePattern 相同 -->
<maxHistory>168</maxHistory>
<!-- 总得文件日志 -->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化输出:%d 表示日期,%thread 表示线程名,%-5level:级别从左显示 5 个字符宽度 %msg:日志消息,%n 是换行符 -->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
<!-- 设置日志编码为 utf-8-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- warn 日志 -->
<appender name="RollingFileWarn" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${LOG_HOME}/warn.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/warn_%d{yyyy-MM-dd-HH}-%i.log.zip</fileNamePattern>
<!-- 单个文件大小 -->
<maxFileSize>10 MB</maxFileSize>
<!--fileNamePattern 的格式为 yyyy-MM-dd-HH, 则日志回收时间也应该与 fileNamePattern 相同 -->
<maxHistory>168</maxHistory>
<!-- 总得文件日志 -->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化输出:%d 表示日期,%thread 表示线程名,%-5level:级别从左显示 5 个字符宽度 %msg:日志消息,%n 是换行符 -->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
<!-- 设置日志编码为 utf-8-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- error 日志 -->
<appender name="RollingFileError" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${LOG_HOME}/error.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/error_%d{yyyy-MM-dd-HH}-%i.log.zip</fileNamePattern>
<!-- 单个文件大小 -->
<maxFileSize>10 MB</maxFileSize>
<!--fileNamePattern 的格式为 yyyy-MM-dd-HH, 则日志回收时间也应该与 fileNamePattern 相同 -->
<maxHistory>168</maxHistory>
<!-- 总得文件日志 -->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化输出:%d 表示日期,%thread 表示线程名,%-5level:级别从左显示 5 个字符宽度 %msg:日志消息,%n 是换行符 -->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
<!-- 设置日志编码为 utf-8-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- app 应用日志 -->
<appender name="RollingFileApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${LOG_HOME}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/app_%d{yyyy-MM-dd-HH}-%i.log.zip</fileNamePattern>
<!-- 单个文件大小 -->
<maxFileSize>10 MB</maxFileSize>
<!--fileNamePattern 的格式为 yyyy-MM-dd-HH, 则日志回收时间也应该与 fileNamePattern 相同 -->
<maxHistory>168</maxHistory>
<!-- 总得文件日志 -->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化输出:%d 表示日期,%thread 表示线程名,%-5level:级别从左显示 5 个字符宽度 %msg:日志消息,%n 是换行符 -->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
<!-- 设置日志编码为 utf-8-->
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="org.springframework" level="info"/>
<!-- 使用日志继承属性 addtivity="false" -->
<logger name="com.javanorth" level="all" addtivity="true"/>
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="RollingFileTrace"/>
<appender-ref ref="RollingFileDebug"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
<appender-ref ref="RollingFileApp"/>
</root>
</configuration>
将所有日志写入一个日志文件的配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
<property name="LOG_HOME" value="./WebAppLogs/logs"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化输出:%d 表示日期,%thread 表示线程名,%-5level:级别从左显示 5 个字符宽度 %msg:日志消息,%n 是换行符 -->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
</encoder>
</appender>
<!-- app 应用日志 -->
<appender name="RollingFileApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${LOG_HOME}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/app_%d{yyyy-MM-dd-HH}-%i.log.zip</fileNamePattern>
<!-- 单个文件大小 -->
<maxFileSize>10 MB</maxFileSize>
<!--fileNamePattern 的格式为 yyyy-MM-dd-HH, 则日志回收时间也应该与 fileNamePattern 相同 -->
<maxHistory>168</maxHistory>
<!-- 总得文件日志 -->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化输出:%d 表示日期,%t 表示线程名,%msg:日志消息,%n 是换行符 -->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
<!-- 设置日志编码为 utf-8-->
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="org.springframework" level="info"/>
<!-- 使用日志继承属性 addtivity="false" -->
<logger name="com.javanorth" level="all" addtivity="true"/>
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="RollingFileApp"/>
</root>
</configuration>
通过 slf4j 实现 logback 日志
public class LogUtil {
/**
* debug 级别日志输出
* @param clazz 类
* @param msg 日志
* @param params 其他参数
*/
public static void debug(Class clazz, String msg, Object... params) {Logger logger = LoggerFactory.getLogger(clazz.getName());
logger.debug(msg, params);
}
/**
* trace 日志输出
* @param clazz 类
* @param msg 日志
* @param params 其他参数
*/
public static void trace(Class clazz, String msg, Object... params) {Logger logger = LoggerFactory.getLogger(clazz.getName());
logger.trace(msg, params);
}
/**
* info 级别日志输出
* @param clazz 类
* @param msg 日志
* @param params 其他参数
*/
public static void info(Class clazz, String msg, Object... params) {Logger logger = LoggerFactory.getLogger(clazz.getName());
logger.info(msg, params);
}
/**
* warn 级别日志输出
* @param clazz 类
* @param msg 日志
* @param params 其他参数
*/
public static void warn(Class clazz, String msg, Object... params) {Logger logger = LoggerFactory.getLogger(clazz);
logger.warn(msg, params);
}
/**
* error 级别日志输出
* @param clazz 类
* @param msg 日志
* @param params 其他参数
*/
public static void error(Class clazz, String msg, Object... params) {Logger logger = LoggerFactory.getLogger(clazz);
logger.error(msg, params);
}
}
slf4j 实现的调用
void contextLoads() {LogUtil.info(this.getClass(), "this is info log");
}
日志输出
总结
总体来说,logback 是在一定程度上是比 log4j2 性能上差一点的,这也在我们之前的文章分析过,但是 logback 仍然为很多人所喜爱,个人认为有 logback 配置的确也比 log4j2 简单和 logback 的日志更加简化,而且对日志继承性要求很严格,这在一定的程度上方便问题查找以及减少不必要的日志。
参考文章
- [1].logback 的使用和 logback.xml 详解.https://www.cnblogs.com/warki…
- [2].logback 网站.http://logback.qos.ch/documen…