【日志技术专题】「logback入门到精通」彻彻底底带你学会logback框架的使用和原理(入门介绍篇)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【日志技术专题】「logback入门到精通」彻彻底底带你学会logback框架的使用和原理(入门介绍篇)

技术介绍


什么是 logback?


  • Logback为取代 log4j 而生。Logback 由 log4j 的创立者 Ceki Gülcü设计。以十多年设计工业级记录系统的经验为基础,所创建的logback 比现有任何记录系统(除了log4j2)更快、占用资源更少,有时差距非常大。


  • Logback提供独特而实用的特性,比如,Marker、参数化记录语句、条件化堆栈跟踪和强大的事件过滤功能。


  • 以上列出的仅仅是 logback 实用特性的一小部分,对于自身的错误报告,logback 依赖状态(Status)对象,状态对象极大地简化了故障查找。


  • Logback-core 附带了 Joran,Joran 是个强大的、通用的配置系统,你可以在自己的项目
  • 里使用 Joran 以获得巨大的作用。



安装搭建


必要条件


Logback-classic依赖slf4j-api.jar和logback-core.jar,现在让我们开始体验 logback。



实例:记录基本模版


  • logback-examples/src/main/java/chapters/introduction/HelloWorld1.java
package chapters.introduction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld1 {
public static void main(String[] args) {
  Logger logger = LoggerFactory .getLogger("chapters.introduction.HelloWorld1");
  logger.debug("Hello world."); }
}
复制代码


  1. HelloWorld1 类导入了 SLF4J API 定义的 Logger 类和 LoggerFactory 类,更明确地说是定义在 org.slf4j 包里的两个类。


  • main方法的第一行里,调用 LoggerFactory 类的静态方法 getLogger 取得一个 Logger 实例,将该实例赋值给变量 logger,logger 被命名为“chapters.introduction.HelloWorld1”。
  • main方法继续调用这个 logger 的 debug 方法并传递参数“Hello world”。我们称之为 main 方法包含了一条消息是“Hello world”、级别是 DEBUG 的记录语句。



注意:上面的例子并没有引用任何 logback 的类。多数情况下,只要涉及到记录,你只需 要引用 SLF4J 的类。因此在绝大多数情况下,你的类只导入 SLF4J 的 API,基本可以忽略 logback 的存在。


Logback可以通过内置的状态系统来报告其内部状态,通过 StatusManager 组件可以访问logback生命期内发生的重要事件。



我们可以调用 StatusPrinter 类的 print()方法来打印 logback 的内部状态。


实例:打印 Logger 状态


package chapters.introduction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext; 
import ch.qos.logback.core.util.StatusPrinter;
public class HelloWorld2 {
public static void main(String[] args) { 
    Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld2");
    logger.debug("Hello world.");
    // print internal state
    LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    StatusPrinter.print(lc); 
 }
}
复制代码


日志输出
12:49:22.203 [main] DEBUG chapters.introduction.HelloWorld2 - Hello world. 12:49:22,078 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find
resource [logback-test.xml]
12:49:22,093 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml]
12:49 :22,093 |-INFO in c h.qos.logbac k.c lassic .LoggerContext[default] - Setting up default
configuration.
复制代码


  1. Logback说它没有找到配置文件 logback-test.xml 和 logback.xml,于是用默认策略进行配置,即用一个基本的ConsoleAppender。


  1. Appender 类可被视为输出目的地的。


  • Appender 包含许多不同类型的目的地:

  • 控制台
  • 文件
  • Syslog
  • TCP 套接字
  • JMS
  • 其他


  • 用户可以很容易地自定义 Appender。


  1. 当发生错误时,logback 将自动在控制台上打印其内部状态。

上面的两个示例相当简单,大型程序里真实记录志情况也不会有太大区别。

  • 记录系统的基本模式不会改变,可能改变的是配置过程。也许你想按照自己的需要来定制或配置logback,之后的章节会讨论配置 logback。
  • 我们调用StatusPrinter.pring()方法来打印 logback 的内部状态。在诊断与logback相关的问题时,logback 的内部状态信息会非常有用。



使用Logback的基本三要素


在应程序里启用记录的三个必需步骤如下:


  1. 配置 logback 环境。
  2. 在每个需要执行记录的类里,调用 org.slf4j.LoggerFactory 类的 getLogger()方法获 取一个 Logger 实例,以当前类名或类本身作为参数。
  3. 调用取得的 logger 实例的打印方法,即 debug()、info()、warn()和 error(),把记录输出到配置里的各 appender。



体系结构


logback 的体系结构


Logback 的基本结构充分通用,可应用于各种不同环境。目前,logback 分为三个模块: Core、Classic 和 Access。


  • Core 模块是其他两个模块的基础。
  • Classic 模块扩展了 core 模块,相当于 log4j 的显著改进版。
  • Logback-classic 直接实现了 SLF4J API,因此你可以在 logback与其他记录系统如 log4j 和 java.util.logging (JUL)之间轻松互相切换。
  • Access 模块与 Servlet 容器集成, 提供 HTTP 访问记录功能。

可以这么说,我们常说的“logback”代表 logback-classic 模块。




Logger、Appender 和 Layout


  • Logback 建立于三个主要类之上:Logger、Appender 和 Layout。这三种组件协同工作, 使开发者可以按照消息类型和级别来记录消息,还可以在程序运行期内控制消息的输出格式 和输出目的地。


  • Logger 类是 logback-classic 模块的一部分,而 Appender 和 Layout 接口来自 logback-core,作为一个多用途模块,logback-core 不包含任何 logger。




Logger上下文


任何比System.out.println高级的记录 API 的第一个也是最重要的优点便是能够在禁用特定记录语句的同时却不妨碍输出其他语句。


这种能力源自记录隔离(space)——即所有各种记录语句的隔离——是根据开发者选择的条件而进行分类的。


  • 在 logback-classic里,这种分类是logger固有的。
  • 各个logger都被关联到一个LoggerContext,LoggerContext 负责制造 logger,也负责以树结构排列各 logger。


Logger是命名了的实体。它们的名字大小写敏感且遵从下面的层次化的命名规则: 命名层 次:



父子继承关系


  • 如果 logger 的名称带上一个点号后是另外一个 logger 的名称的前缀,那么,前者就被称为后者的祖先。
  • 如果 logger 与其后代 logger 之间没有其他祖先,那么,前者就被称为子 logger 之父。

比如,名为“com.foo"”的 logger 是名为“com.foo.Bar”之父。同理,“java”是“java.util"” 之父,也是“java.util.Vector”的祖先。



ROOT logger


根logger 位于 logger 等级的最顶端,它的特别之处是它是每个层次等级的共同始祖。 如同其他各 logger,根 logger 可以通过其名称取得,如下所示:

Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); 
复制代码


其他所有logger也通过org.slf4j.LoggerFactory 类的静态方法getLogger取得。getLogger 方法以 logger 名称为参数。Logger 接口的部分基本方法列举如下:

package org.slf4j;
   public interface Logger {
  // Printing methods:
  public void trace(String message); 
  public void debug(String message);
  public void info(String message);
  public void warn(String message); 
  public void error(String message);
}
复制代码



有效级别(Level)即级别继承


Logger可以被分配级别。级别包括:TRACE、DEBUG、INFO、WARN 和 ERROR,定义于 ch.qos.logback.classic.Level 类。


注意:在logback 里,Level 类是 final 的,不能被继承, Marker 对象提供了更灵活的方法。


如果 logger 没有被分配级别,那么它将从有被分配级别的最近的祖先那里继承级别。 更正式地说:


  • logger L 的有效级别等于其层次等级里的第一个非 null 级别,顺序是从 L 开始,向上 直至根 logger。
  • 为确保所有 logger 都能够最终继承一个级别,根 logger 总是有级别,默认情况下,这 个级别是 DEBUG。


下一篇会介绍相关对于等级分析logback的内容!




相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
286 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
81 5
|
2月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
318 3
|
1月前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
35 1
|
2月前
|
存储 运维 监控
Elasticsearch Serverless 高性价比智能日志分析关键技术解读
本文解析了Elasticsearch Serverless在智能日志分析领域的关键技术、优势及应用价值。
104 8
Elasticsearch Serverless 高性价比智能日志分析关键技术解读
|
2月前
|
SQL 存储 关系型数据库
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
老架构师尼恩在其读者交流群中分享了关于 MySQL 中 redo log、undo log 和 binlog 的面试题及其答案。这些问题涵盖了事务的 ACID 特性、日志的一致性问题、SQL 语句的执行流程等。尼恩详细解释了这些日志的作用、所在架构层级、日志形式、缓存机制以及写文件方式等内容。他还提供了多个面试题的详细解答,帮助读者系统化地掌握这些知识点,提升面试表现。此外,尼恩还推荐了《尼恩Java面试宝典PDF》和其他技术圣经系列PDF,帮助读者进一步巩固知识,实现“offer自由”。
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
|
2月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1698 14
|
2月前
|
存储 Java Android开发
Android|记一个导致 logback 无法输出日志的问题
在给一个 Android 项目添加 logback 日志框架时,遇到一个导致无法正常输出日志的问题,这里记录一下。
39 2
|
2月前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
132 1
|
3月前
|
存储 缓存 关系型数据库
redo log 原理解析
redo log 原理解析
51 0
redo log 原理解析
下一篇
DataWorks