一、logback简介
logback当前分成三个模块:logback-core,logback-classic和logback-access.
logback-core是其它两个模块的基础模块。
logback-classic是log4j的一个改良版本。此外logback-classic完整实现SLF4J API。使你可以很方便的更换其它日志系统如log4j2或者JDK14 Logging。
logback-access访问模块与servlet容器集成,提供通过Http来访问日志的功能。
二、logback中的组件
Logger:日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别。
Appender:用于指定日志输出的目的地,目的地可以使控制台、文件、数据库等等。
Layout:负责把事件转换成字符串,格式化的日志信息的输出。
在Logback中Layout对象被封装在encoder中。
也就是说我们未来使用的encoder其实就是Layout。
三、Logback配置文件
Logback提供了3种配置文件:logback.groovy,logback-test.xml,logback.xml.
四、日志输出格式
日志输出格式:
%-10level 级别 案例为设置10个字符,左对齐
%d{yyyy-MM-dd HH:mm:ss.SSS} 日期
%c 当前类全限定名
%M 当前执行日志的方法
%L 行号
%thread 线程名称
%m或者%msg 信息
%n 换行
五、入门案例
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogbackTest {
@Test
public void test01(){
Logger logger = LoggerFactory.getLogger(LogbackTest.class);
logger.trace("trace:日志追踪信息");
logger.debug("debug:日志详细信息");
logger.info("info关键信息");
logger.warn("warn:日志警告信息");
logger.error("error:日志错误信息");
}
}
六、Logback配置文件
logback配置文件的使用:在resource下面,创建一份配置文件,命名为logback.xml。系统可以自动识别出来。
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--配置文件通用属性
所谓配置文件中的通用属性是为了让接下来的配置使用更加方便引用。
通过以${name}的形式,方便的取得value的值,通过取得的value值
可以做文件的其他配置而使用。
-->
<!--日志输出格式相关的配置
日志输出格式:
%-10level 级别 案例为设置10个字符,左对齐
%d{yyyy-MM-dd HH:mm:ss.SSS} 日期
%c 当前类全限定名
%M 当前执行日志的方法
%L 行号
%thread 线程名称
%m或者%msg 信息
%n 换行
以property的形式将日志输出格式配置成为文件的通用属性,那么下面我们配置的输出方式中,
就可以重复引用该配置。
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m %n"></property>
<!--配置文件输出路径 -->
<property name="logDir" value="F:\\project\\workspace\\springboot_log"></property>
<!-- 一定需要配置appender-->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<!--target表示对于日志目标的配置
默认:System.out 表示以黑色字体输出日志
设置:System.err 表示以红色字体输出日志
-->
<target>
System.err
</target>
<!--
配置日志输出格式,手动配置格式的方式,直接引入上述的通用属性即可
-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式引用通用属性配置-->
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- -->
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
<!-- 引入文件位置-->
<file>${logDir}/logback.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!--
日志记录器,root标签就代表root logger
level:配置日志级别
可以同时配置多个appender,做日志的多方向的输出
-->
<root level="info">
<appender-ref ref="consoleAppender"></appender-ref>
<appender-ref ref="fileAppender"></appender-ref>
</root>
</configuration>
七、日志文件-日志的拆分和压缩
<!--配置文件的appender,可拆分归档的文件 -->
<appender name="rollAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--输入格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--引入文件的位置-->
<file>${logDir}/roll_logback.log</file>
<!--指定拆分规则 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--按照时间和和压缩格式声明文件名 压缩格式gz -->
<fileNamePattern>${logDir}/roll.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
<!--按照文件大小来进行拆分 -->
<maxFileSize>1KB</maxFileSize>
</rollingPolicy>
</appender>
八、logback通过过滤器更细粒度的记录日志
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m %n"></property>
<!--配置文件输出路径 -->
<property name="logDir" value="F:\\project\\springboot_log"></property>
<!-- 一定需要配置appender-->
<!-- 配置Console的appender,使用过滤器-->
<appender name="consoleFilterAppender" class="ch.qos.logback.core.ConsoleAppender">
<target>System.err</target>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--设置日志的输出级别 -->
<level>ERROR</level>
<!-- onMatch表示高于等于level的日志就打印 -->
<onMatch>ACCEPT</onMatch>
<!--低于level中设置的级别,则屏蔽日志 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--
日志记录器,root标签就代表root logger
level:配置日志级别
可以同时配置多个appender,做日志的多方向的输出
-->
<root level="all">
<appender-ref ref="consoleFilterAppender"></appender-ref>
</root>
</configuration>
九、异步日志
代码从上到下执行,由此得出会出现的问题:只要是在记录日志,系统本身就处于停滞的状态。当日志执行完成后才会其他代码。当日志记录非常庞大的时候,那么我们对于系统本身业务代码的执行效率非常低。Logback为我们提供了异步日志的功能。
配置异步日志的方式:1. 在异步日志中引入我们真正需要输出的appender。
<appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="consoleAppender"></appender-ref>
</appender>
2. 在rootlogger下引入异步日志
<appender-ref ref="asyncAppender"></appender-ref>
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m %n"></property>
<!--配置文件输出路径 -->
<property name="logDir" value="F:\\project\\springboot_log"></property>
<!-- 一定需要配置appender-->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<target>
System.err
</target>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式引用通用属性配置-->
<pattern>${pattern}</pattern>
</encoder>
</appender>
<appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="consoleAppender"></appender-ref>
</appender>
<root level="all">
<appender-ref ref="asyncAppender"></appender-ref>
</root>
</configuration>
3. 在实际项目中,越大的项目对于日志的记录就越庞大。为了保证项目的执行效率,尽量使用异步日志。
十、自定义Logger
<!--additivity="false"表示不继承rootlogger,优先级比rootlogger高 -->
<logger name="com.atredhorse" level="info" additivity="false">
<!--在自定义logger中配置appender -->
<appender-ref ref="consoleAppender"></appender-ref>
</logger>