技术介绍

什么是 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。

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

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

      • 控制台
      • 文件
      • Syslog
      • TCP 套接字
      • JMS
      • 其他
    • 用户可以很容易地自定义 Appender。
  3. 当发生错误时,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的内容!

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

  1. Spring Boot从入门到精通(九)整合Spring Data JPA应用框架

    JPA是什么? JPA全称Java Persistence API,是Sun官方提出的Java持久化规范.是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. ...

  2. 600集Python从入门到精通教程(懂中文就能学会)

    目录大纲: 本套教程15天 1-3   天内容为Linux基础命令 4-13  天内容为Python基础教程 14-15 天内容为 飞机大战项目演练 视频概括: 第一阶段(1-3天): 该阶段首先通过 ...

  3. ASP.NET MVC4入门到精通系列目录汇总

    序言 最近公司在招.NET程序员,我发现好多来公司面试的.NET程序员居然都没有 ASP.NET MVC项目经验,其中包括一些工作4.5年了,甚至8年10年的,许多人给我的感觉是:工作了4.5年,We ...

  4. Scala入门到精通

    原文出自于: http://my.csdn.net/lovehuangjiaju 感谢! 也感谢,http://m.blog.csdn.net/article/details?id=52233484 ...

  5. ASP.NET MVC4入门到精通系列目录汇总(转)

    序言 最近公司在招.NET程序员,我发现好多来公司面试的.NET程序员居然都没有 ASP.NET MVC项目经验,其中包括一些工作4.5年了,甚至8年10年的,许多人给我的感觉是:工作了4.5年,We ...

  6. 《MySQL数据库从入门到精通》 高级运维人才的必备书籍

    众所周知,每年就业市场都会迎来千万量级的高校毕业生,然而企业招工难和毕业生就业难的矛盾却一直没有得到很好地解决.究其原因,主要矛盾还是在于传统的学历教育与企业实际需求相脱节.为了杜绝高校毕业生求职时常 ...

  7. Jenkins pipeline 入门到精通系列文章

    Jenkins2 入门到精通系列文章. Jenkins2 下载与启动jenkins2 插件安装jenkins2 hellopipelinejenkins2 pipeline介绍jenkins2 jav ...

  8. PS入门到精通完全自学教程

    ps视频教程,ps自学视频教程.ps免费视频教程下载,PS入门到精通完全自学教程视频内容较大,分为俩部分: PS入门到精通完全自学教程-第一部分(带swf播放器):百度网盘,https://pan.b ...

  9. WF从入门到精通学习目录

    WF从入门到精通(第一章):WF简介 WF从入门到精通(第二章):workflow运行时 WF从入门到精通(第三章):workflow实例 WF从入门到精通(第四章):活动及workflow类型介绍 ...

随机推荐

  1. Ubuntu18.04 + NVidia显卡 + Anaconda3 + Tensorflow-GPU 安装、配置、测试 (无需手动安装CUDA)

    其中其决定作用的是这篇文章  https://www.pugetsystems.com/labs/hpc/Install-TensorFlow-with-GPU-Support-the-Easy-Wa ...

  2. 编写你的第一个Django应用

    安装 Python 作为一个 Python Web 框架,Django 需要 Python.更多细节请参见 我应该使用哪个版本的 Python 来配合 Django?. Python 包含了一个名为  ...

  3. SpringMVC笔记(2)

    一.SpringMVC的数据响应 1.1 数据响应方式 1.1.1 页面跳转 直接返回字符串 将返回的字符串与内部资源视图解析器的前后缀拼接 进行访问(默认为转发) 通过ModelAndView对象返 ...

  4. JVM加载class文件的一些理解

    Java是一种动态解释型语言,类(class)只有被加载到JVM中后才能运行.每当一个Java程序运行时,都会有一个对应的JVM实例,只有当程序运行结束后,这个JVM才会退出.JVM实例通过调用类的m ...

  5. 一文读懂Base64编码

    Base64编码 字符对应表 上表就是用来表示Base64,一共64个字符,A-Z,a-z,0-9,+,-,还有=(作为补位) 无论将文件,字符串,还是什么转为Base64,一定是用上表的字符表示. ...

  6. Python - 通过PyYaml库操作YAML文件

    PyYaml简单介绍 Python的PyYAML模块是Python的YAML解析器和生成器 它有个版本分水岭,就是5.1 读取YAML5.1之前的读取方法 def read_yaml(self, pa ...

  7. Java链表练习题小结

    链表 链表(Linked List)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).一个链表节点至少包含一个 数据域和 ...

  8. 分享一则Linux系统邮件提示 /usr/local/lib/libprocesshider.so > /etc/ld.so.preload 的中病毒解决方法

    ​ 系统环境:CentOS Linux release 7.6.1810 (AltArch)                   CPU架构:ARM            最近发现生产服务器CPU占用 ...

  9. Java反序列化漏洞Apache CommonsCollections分析

    Java反序列化漏洞Apache CommonsCollections分析 cc链,既为Commons-Collections利用链.此篇文章为cc链的第一条链CC1.而CC1目前用的比较多的有两条链 ...

  10. 【PHP】数组按照字母排序

    /** * 将数组按字母A-Z排序 * @return [type] [description] */ private function chartSort($list) { // $user=$th ...