基础知识
什么是logback
Logback是一个用于Java应用程序的日志框架,提供了更好的性能、可扩展性和灵活性。
与Log4j相比,Logback提供了更快的速度和更低的内存占用,这使得它成为大型企业级应用程序的理想选择。
logback和slf4j的关系是
logback是slf4j的一个具体实现。slf4j是一个日志门面(facade),提供了一系列的日志接口,而logback是实现这些接口的具体日志框架。应用程序通过调用slf4j的API进行日志操作,而实际的日志输出是由底层的日志框架(如logback)来实现的。
示例程序
引入的包
将slf4j-api.jar
、logback-core.jar
、logback-classic.jar
引入项目。
引用的包先不着急,我是springboot的项目,pom.xml用的spring的其他包自动引用了
配置文件
在application.yml中增加配置
logging: config: classpath:mylogback.xml
在Springboot项目中,如果没有配置,自动寻找 src/main/resources路径下的logback-spring.xml
的文件
配置文件基本结构如下图:
logger标签
logger就是日志记录器,用来控制要输出哪些日志记录语句,对日志信息进行级别限制。
有level属性、name属性、additivity属性,其中name属性必须要写,指定到哪一个类或者哪一个包,additivity表示是否向上一层传递打印信息,默认为true。可以包含 appender-ref 元素
使用示例:
<configuration>
<logger level="ERROR" name="com.example.testlog.LogTest" additivity="false">
<appender-ref ref="STDOUT"></appender-ref>
</logger>
</configuration>
root标签
root标签指定最基础的的日志输出级别,它只有一个level属性,可以包含 appender-ref 元素。
level属性可以选择,ALL
、TRACE
、DEBUG
、INFO
、WARN
、ERROR
、NULL
、OFF
、INHERITED
使用示例:
<configuration>
<root level="debug">
<appender-ref ref="STDOUT"></appender-ref>
</root>
</configuration>
appender标签
appender就是附加器,日志记录器会将输出的任务交给附加器完成,不同的附加器会将日志输出到不同的地方,例如控制台、文件、网络等
几个常见的附加器:
控制台附加器:ch.qos.logback.core.ConsoleAppender
文件附加器:ch.qos.logback.core.FileAppender
滚动文件附加器:ch.qos.logback.core.rolling.RollingFileAppender
属性有name、class,class用来指定附加器,name来表示当前附件器的名字。其他需要指定附件器的标签,可以通过appender-ref标签中的ref来指定。可以包含encoder元素、fileter元素等
使用示例:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
</configuration>
filter标签
filter是过滤器,过滤器是附件器的一个组件,它是用于判断附件器是否输出日志的。一个附件器可以包含多个过滤器。
过滤器只能有三个值,DENY、NEUTRAL、ACCEPT。
DENY是不输出日志
NEUTRAL是不决定是否输出日志
ACCEPT是输出日志。
可以有三个元素,level元素、onMatch元素、onMismatch元素。<level>:设置过滤级别
<onMatch>:用于配置符合过滤条件的操作
<onMismatch>:用于配置不符合过滤条件的操作。
使用示例:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter>
<level>info</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
</configuration>
encoder标签
encoder最主要的就是pattern标签,用于控制输出日志的格式
%d
: 表示日期%-5level
:日志级别%thread
:表示线程名%logger
:输出日志的类名logger{length}
:对输出日志的类名缩写展示%msg
:日志输出内容%n
:换行符-
:左对齐
使用示例:
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
</encoder>
property标签(变量配置)
property标签用来定义变量, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值
使用示例:
<property name="HOME" value="../log">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<file>${HOME}/log.log</file>
</appender>
logger和root的区别
在logback中,logger和root logger都是日志记录器(logger)的实例,用于控制日志的输出级别。它们之间的区别在于它们的作用范围和默认配置。
logger是应用程序中的具体组件或类的日志记录器。每个logger都可以单独配置,以控制特定组件或类的日志输出级别。通过logger,我们可以对不同的组件或类设置不同的日志级别,从而灵活地控制日志的输出。
root logger是logger的顶级父级别。它是logger层次结构的根节点,用于控制整个应用程序的日志输出级别。如果没有为特定的logger配置日志级别,那么它将继承root logger的日志级别。因此,root logger的日志级别可以被视为默认的全局日志级别。
完整配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/logfile.log</file>
<append>true</append>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT"/>
</root>
<logger level="debug" name="com.sheng" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</logger>
</configuration>
代码
package com.sheng.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogTest {
final static Logger logger = LoggerFactory.getLogger(LogTest.class);
public static void main(String[] args) {
logger.debug("Debug message");
logger.info("Info message");
logger.warn("Warning message");
logger.error("Error message");
}
}
结果
终端打印
文件打印