Logback 旨在作为流行的 log4j 项目的继承者。它是由 log4j 的创始人 Ceki Gülcü 设计的。它建立在十年来设计工业级测井系统的经验之上。由此产生的产品,即 logback,比所有现有的日志系统速度更快,占用空间更小,有时甚至相差很大。同样重要的是,logback 提供了其他日志系统所缺少的 独特且相当有用的功能。
看了上述文字的说明,我们是否对logback还有些困惑,我们可以开始使用logback的第一个程序,来认识一下logbcak
1.创建Maven项目
2.增加maven依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.36</version>
</dependency>
package com.gongli;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Hello world!
*
*/
public class App {
private static final Logger logger
= LoggerFactory.getLogger(App.class);
public static void main(String[] args) {
logger.info("hello world");
}
}
这段代码展示了如何使用日志记录器来记录程序的运行信息。它创建了一个名为 App 的类,并在其中定义了一个 main 方法。在 main 方法中,它使用 LoggerFactory 类获取了一个日志记录器对象,并使用该对象记录了一条信息日志。
认识到第一个日入门日志以后,我们就开始认识Logbcak的结构。如图:
Logger, Appender 和 Layouts
Logback 构建在三个主要的类上:Logger,Appender 和 Layouts。这三个不同类型的组件一起作用能够让开发者根据消息的类型以及日志的级别来打印日志。
Logger 类作为 logback-classic 模块的一部分。Appender 与 Layouts 接口作为 logback-core 的一部分。作为一个通用的模块,logback-core 没有 logger 的概念。
在具体了解日志配置文件之间,我们必须先知道日志的级别是什么?
日志级别用于控制哪些日志会被记录。日志级别从高到低依次为:
FATAL: 致命错误,表示程序无法继续运行。
ERROR: 错误,表示程序发生了错误,但仍能继续运行。
WARN: 警告,表示程序可能发生错误,但不影响程序的正常运行。
INFO: 信息,用于记录程序的正常运行状态。
DEBUG: 调试,用于记录程序的运行细节。
TRACE: 跟踪,用于记录程序的运行轨迹。
大小从上往下依次减小,这条规则是 logback 的核心。它假设级别按如下顺序排序: TRACE < DEBUG < INFO < WARN < ERROR。
例如以下程序,我设父类日志的级别为error ,你猜一下子类的日志级别info会正常输出吗?
public static void main(String[] args) {
//我设父类的日志级别为Info
ch.qos.logback.classic.Logger logger1=( ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com");
logger1.setLevel(Level.ERROR);
logger1.info("hello world");
}
答案是显然不会
我们再来做一个实验,如果我们指定了根的日志级别,也指定了根的子类级别。你想想看我们的日志级别是遵守根的,还是遵守子类的呢?话不多说,我们来试试看。
public static void main(String[] args) {
//我设父类的日志级别为Info
ch.qos.logback.classic.Logger logger1=( ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.gongli.App");
ch.qos.logback.classic.Logger rootlogger=( ch.qos.logback.classic.Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
rootlogger.setLevel(Level.WARN);
logger1.setLevel(Level.INFO);
System.out.println(logger1.getEffectiveLevel());
logger1.trace("hello world");
}
事实证明,在我子类设置的情况下,我们会遵循子类的日志级别
从而我们得出一个结论,如果子类包没设置级别,就会往上一级找,如果上一级也没设置,就默认日志级别打印。
每个记录器Logger的属性有两个属性
name属性:记录器的名称
level尾性(可选): 记录的级别,允许的级别从低到高,TRACE< DEBUG<INFO< WARN<ERROR
logger.setLevel()
logger.getLevel():
logger.getEffectiveLevel()
additivity属性(可选): 是否允许爱加打印日志,true或false
说明:
1)如果记录器未设置level属性,则该记录器的级别从上级记录器继承
2)如果想查看记录器的级别,应该通过logger.getEffectiveLevel方法,同时要将Logger转为
ch.qos.logback.classic.Logger类型,如下:
ch.gos.logbackclassic.Logger logger =
(ch.qos.logbackclassic.Logger) LoggerFactory.getLogger(App.class);
举一个代码的例子,你们就懂我在说什么了
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class App {
private static final Logger logger = LoggerFactory.getLogger(App.class);
public static void main(String[] args) {
// 设置 logger 的名称
logger.setName("MyLogger");
// 设置 logger 的级别
logger.setLevel(Level.INFO);
// 获取 logger 的级别
Level level = logger.getLevel();
// 获取 logger 的有效级别
Level effectiveLevel = logger.getEffectiveLevel();
// 检查 logger 的 additivity 属性
boolean additivity = logger.isAdditive();
System.out.println("logger 的名称:" + logger.getName());
System.out.println("logger 的级别:" + level);
System.out.println("logger 的有效级别:" + effectiveLevel);
System.out.println("logger 的 additivity 属性:" + additivity);
}
}
使用logback-test.xml或 logback.xml进行配置
这里分为两步
1.新建一个logback.xml
文件内容如下:
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation=
"http://www.padual.com/java/logback.xsd">
<root level="debug"> // 设置root的
</root>
<logger name="com.aa" level="error"></logger> //声明一个记录器
</configuration>
2.编写java代码
public static void main(String[] args) {
ch.qos.logback.classic.Logger rootlogger=( ch.qos.logback.classic.Logger) LoggerFactory.getLogger("root");
System.out.println(rootlogger.getEffectiveLevel());
ch.qos.logback.classic.Logger logger=( ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.aa");
System.out.println(logger.getEffectiveLevel());
}
}
Logback 将写入日志事件的任务委托给称为附加程序的组件。Appender 必须实现该日志记录器的 接口。
常用的附加器如下:
控制台附加器:ch.qos.logback.core.ConsoleAppender
文件附加器: ch.qos.logback.core.FileAppender
滚动文件附加器: ch.gos.logback.core.rolling.RollingFileAppender
控制台附加器(ch.qos.logback.core.ConsoleAppender)的常用参数如下:
name:附加器的名称。
encoder:编码器。
target:目标。默认为 System.out。
encoding:编码。默认为 UTF-8。
immediateFlush:是否立即刷新。默认为 true。
filter:日志过滤器。
以下是这些参数的具体说明:
name
name 属性指定附加器的名称。名称用于标识附加器。
encoder
encoder 属性指定编码器。编码器用于格式化日志。
target
target 属性指定目标。目标用于指定日志输出的位置。默认为 System.out。
encoding
encoding 属性指定编码。编码用于指定日志的编码格式。默认为 UTF-8。
immediateFlush
immediateFlush 属性指定是否立即刷新。如果为 true,则日志将在写入到控制台之前立即刷新。如果为 false,则日志将在缓冲区满时刷新。
filter
filter 属性指定日志过滤器。日志过滤器用于过滤日志。
例子:
logback.xml文件配置如下
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation=
"http://www.padual.com/java/logback.xsd">
//这里就是声明控制台附加器
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder> //日志格式化格式
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
</encoder>
</appender>
<logger name="com.gongli" level="info">
//加入附加器
<appender-ref ref="STDOUT" />
</logger>
</configuration>
代码如下:
public static void main(String[] args) {
ch.qos.logback.classic.Logger logger1=( ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.gongli.App");
logger1.info("hello world");
}
}
文件附加器(ch.qos.logback.core.FileAppender)的常用参数如下:
name:附加器的名称。
file:日志文件的路径。
append:是否追加日志。默认为 true。
encoder:编码器。
rollingPolicy:滚动策略。
filter:日志过滤器。
以下是这些参数的具体说明:
name
name 属性指定附加器的名称。名称用于标识附加器。
file
file 属性指定日志文件的路径。
append
append 属性指定是否追加日志。如果为 true,则日志将追加到现有文件中。如果为 false,则日志将覆盖现有文件。
encoder
encoder 属性指定编码器。编码器用于格式化日志。
rollingPolicy
rollingPolicy 属性指定滚动策略。滚动策略用于控制日志文件的滚动方式。
filter
filter 属性指定日志过滤器。日志过滤器用于过滤日志。
例子
logbcak.xml文件
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation=
"http://www.padual.com/java/logback.xsd">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
</encoder>
</appender>
<appender name="File" class="ch.qos.logback.core.FileAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
</encoder>
<file>myfile.log</file>//文档
<append>true</append> //是否追加数据
</appender>
<logger name="com.gongli" level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="File" />
</logger>
</configuration>
java代码
public static void main(String[] args) {
ch.qos.logback.classic.Logger logger1=( ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.gongli.App");
logger1.info("hello world");
}
}
这里要特别说明一下这几个参数
Logback 提供了多种滚动策略,包括:
SizeBasedRollingPolicy:根据文件大小滚动日志文件。(ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy)
TimeBasedRollingPolicy:根据时间滚动日志文件。(ch.qos.logback.core.rolling.TimeBasedRollingPolicy)
说说他们之间的区别
区别
SizeBasedRollingPolicy 和 TimeBasedRollingPolicy 的主要区别在于滚动触发条件的不同。SizeBasedRollingPolicy 的滚动触发条件是文件大小,而 TimeBasedRollingPolicy 的滚动触发条件是时间。
例如:
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/myapp.log</file>
<append>true</append>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<maxFileSize>10MB </maxFileSize>
</maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
在上述配置中,maxFileSize 属性指定日志文件的最大大小为 10MB。当日志文件的大小达到 10MB 时,将会创建一个新的日志文件,并将原来的日志文件重命名为 myapp.log.1。
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/myapp.log</file>
<append>true</append>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>myapp.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
在上述配置中,fileNamePattern 属性指定新日志文件的文件名模式为 myapp.log.yyyy-MM-dd。也就是说,每天将会创建一个新的日志文件。
过滤器是附加器的一个组件,它用于决定附加器是否输出日志。一个附加器可以包合一个或多个过滤器。
每个过滤器都会返回一个枚举值,可选的值: DENY、 NEUTRAL、ACCEPT
附加器根据过滤器返回值判断是否输出日志:
DENY : 不输出日志
ACCEPT: 输出日志
NEUTRAL : 中立,即不决定是否输出日志
常用的过滤器如下:
LevelFilter(级别过滤器): 实现类 ch.qos.logback.classic.filter.LevelFilter
ThresholdFilter(闽值过滤器): 实现类 ch.gos.logback.classic.filter.ThresholdFilter
EvaluatorFilter(评估者过滤器): 实现类 ch.qos.logback.core.filter.EvaluatorFilter
JaninoEventEvaluator过滤器: 实现类 ch.qos.logback.core.filter.EvaluatorFilter
TurboFilter涡轮过滤器
DuplicateMessageFilter 重复消息过滤器
这里举一个简单的例子LevelFilter(级别过滤器)
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<OnMatch>ACCEPT</OnMatch>
<onMismatch>DENY</onMismatch>
</filter>
<logger name="com.gongli" level="info">
<appender-ref ref="STDOUT" />
</logger>
具体说明:
如果程序记录了一条 INFO 级别的日志,由于其级别与 level 属性匹配,会被 OnMatch 属性接受,因此会输出到控制台。
如果程序记录了一条 DEBUG 级别的日志,由于其级别低于 level 属性,会被 onMismatch 属性拒绝,因此不会输出到控制台。
Spring Boot 默认使用 Logback 作为日志框架。要将 Logback 整合到 Spring Boot 项目中,只需在项目的 pom.xml 文件中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
</dependencies>
接下来,需要在项目的 application.properties 文件中配置 Logback。Logback 的配置文件格式为 XML。可以使用以下示例来配置 Logback:
logging.config=classpath:my-logback.xml
然后我们在resource下面新建my-logback.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>myapp.log</file>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>myapp.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<logger name="com.example.myapp" level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
如果大家想深入了解logbcak,建议去它的官网去看看,内容给很多,我把官网粘在这里里
https://logback.qos.ch/manual/introduction.html