(一)Logback介绍及架构

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: (一)Logback介绍及架构

一、什么是Logback?


Logback是Log4j项目的继承者,由Log4j创始人Ceki Gülcü基于过去十年企业级日志系统设计经验打造。Logback比目前所有已存的日志系统要快,它提供了其它日志系统缺失的独特和有用的特性。


二、Logback架构


Logback分为3个模块:logback-core、logback-classic和logback-access。core模块为其它两个模块奠定了基础,classic模块拓展了core模块,classic模块意义上来说相当于Log4j的进阶版本。Logback-classic模块实现了SLF4J API(simple logging facade for java,日志规范,logback为其中一种实现),因此能轻易在Logback和其它日志系统(如:log4j、java.util.logging)切换。


1、Logger(日志记录器)


Loggers命名为实体,他们的名字大小写敏感并且遵循层级命名规则(如果一个logger名字加点是另一个logger名字的前缀,则这个logger是另一个logger的祖先logger)。例如,名为"com.foo"的logger是名为"com.foo.Bar"的父logger。


Root logger在logger层级中处于最上级,可以通过名字进行检索。

Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);


其它的日志记录器能通过LoggerFactory的静态方法getLogger检索,方法参数的名字为日志记录器的名字,下面是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); 
}


2、Effective Level & Level Inheritence(有效等级和等级继承)


日志记录器可以指定级别,如:TRACE、DEBUG、INFO、WARN、ERROR。如果给定的日志记录器没有指定级别,那么它会继承最近祖先的级别,root日志记录器默认被分配的级别为DEBUG,下面是一些例子:


日志记录器名字 分配的级别 有效级别
ROOT DEBUG DEBUG
X NONE DEBUG
X.Y NONE DEBUG
X.Y.Z NONE DEBUG


日志记录器名字 分配的级别 有效级别
ROOT EROOR EROOR
X INFO INFO
X.Y DEBUG DEBUG
X.Y.Z WARN WARN


日志记录器名字 分配的级别 有效级别
ROOT DEBUG DEBUG
X INFO INFO
X.Y NONE INFO
X.Y.Z EROOR EROOR



日志记录器名字 分配的级别 有效级别
ROOT DEBUG DEBUG
X INFO INFO
X.Y NONE INFO
X.Y.Z NONE INFO



3、 打印方法基本选择规则


如果打印方法级别高于日志记录器的有效级别,那么日志请求是有效的,例如:日志请求的级别是p,日志记录器的有效级别为q,如果日志请求可用,则p>=q。级别排序:TRACE<=DEBUG<=INFO<=WARN<=ERROR<=OFF。


下面图表描述了选择规则如何运作。


日志请求 日志记录器有效级别
TRACE DEBUG INFO WARN ERROR OFF
TRACE YES NO NO NO NO NO
DEBUG YES YES NO NO NO NO
INFO YES YES YES NO NO NO
WARN YES YES YES YES NO NO
ERROR YES YES YES YES YES NO



4、检索日志记录器


调用LoggerFactory.getLogger方法并指定相同的名字会返回相同的logger对象。例如x和y引用相同的logger对象:


Logger x = LoggerFactory.getLogger("wombat"); 
Logger y = LoggerFactory.getLogger("wombat");


5、Appenders & Layouts(输出源和布局)


日志输出的目的地叫做appender,目前存在的输出源有控制台、文件、远程套接字服务器、数据库和JMS等。


到指定日志记录器的日志请求会被转发到日志记录器的所有输出源以及高层级的输出源,什么叫高层级输出源,其实就是祖先日志记录器里配置的输出源。换句话说,输出源是叠加性地继承。下面图标清楚地展示了输出源的叠加性。


日志记录器名 附加的输出源 叠加性标识 输出目的地 备注
root A1 A1
x A-x1, A-x2 true A1, A-x1, A-x2
x.y none true A1, A-x1, A-x2
x.y.z A-xyz1 true A1, A-x1, A-x2, A-xyz1
security A-sec false A-sec 叠加性表示为false,无输出源聚集
security.access none true A-sec security叠加性标识为false,因此输出源只有security附加的输出源



6、参数化日志打印


logback-classic中的日志记录器实现了SLF4J中的Logger接口,里面的日志打印方法在最小化对代码可读性造成影响的同时主要用来改善性能。

logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));


上面这种日志打印方法会增加构造消息参数的性能,不管消息是否可以被打印,都会把整型变量i和entry[i]转换成字符串,然后再进行字符串拼接。

if(logger.isDebugEnabled()) { 
  logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}


上面这种方式如果debugging不可用不会增加参数构造的性能,但如果debugging可用,那么会有两处地方会耗性能,一处在判断debug是否可用,一处在参数构造。

更好的方式:

Object entry = new SomeObject(); 
logger.debug("The entry is {}.", entry);

通过上面这种方式,只有确定打印日志时,日志记录器实现才会格式化消息并且替代占位符。换句话说,这种形式在日志打印不可用的时候不会造成参数构造时的性能消耗。

logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);

上面两条语句会产生相同的输出,但当日志打印不可用时,第二种方式会胜过第一种方式。

logger.debug("The new entry is {}. It replaces {}.", entry, oldEntry);


两个参数可以采用如上方式。

1. Object[] paramArray = {newVal, below, above};
2. logger.debug("Value {} was inserted between {} and {}.", paramArray);


三个或以上参数可以采用如上方式。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
XML JSON 监控
浅谈logback日志架构
浅谈logback日志架构
147 0
|
XML JSON 监控
浅谈logback日志架构
浅谈logback日志架构
228 0
|
缓存 Java
Logback 架构与输出流程
Logback 主要由三个 jar 一起组成 • slf4j-api • logback-core • logback-classic
220 0
|
1月前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
13天前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
22天前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
35 3
|
1月前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
12天前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
117 68
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
14天前
|
设计模式 负载均衡 监控
探索微服务架构下的API网关设计
在微服务的大潮中,API网关如同一座桥梁,连接着服务的提供者与消费者。本文将深入探讨API网关的核心功能、设计原则及实现策略,旨在为读者揭示如何构建一个高效、可靠的API网关。通过分析API网关在微服务架构中的作用和挑战,我们将了解到,一个优秀的API网关不仅要处理服务路由、负载均衡、认证授权等基础问题,还需考虑如何提升系统的可扩展性、安全性和可维护性。文章最后将提供实用的代码示例,帮助读者更好地理解和应用API网关的设计概念。
45 8
|
1月前
|
Dubbo Java 应用服务中间件
服务架构的演进:从单体到微服务的探索之旅
随着企业业务的不断拓展和复杂度的提升,对软件系统架构的要求也日益严苛。传统的架构模式在应对现代业务场景时逐渐暴露出诸多局限性,于是服务架构开启了持续演变之路。从单体架构的简易便捷,到分布式架构的模块化解耦,再到微服务架构的精细化管理,企业对技术的选择变得至关重要,尤其是 Spring Cloud 和 Dubbo 等微服务技术的对比和应用,直接影响着项目的成败。 本篇文章会从服务架构的演进开始分析,探索从单体项目到微服务项目的演变过程。然后也会对目前常见的微服务技术进行对比,找到目前市面上所常用的技术给大家进行讲解。
48 1
服务架构的演进:从单体到微服务的探索之旅