(一)Logback介绍及架构

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Logback是Log4j项目的继承者,由Log4j创始人Ceki Gülcü基于过去十年企业级日志系统设计经验打造。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等。


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

5.png


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);

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

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

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

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
Kubernetes 搜索推荐 Linux
Containerd容器镜像管理
Containerd容器镜像管理
|
Oracle 关系型数据库 数据库
OceanBase数据库常见问题之租户创建后想要改字符集如何解决
OceanBase 是一款由阿里巴巴集团研发的企业级分布式关系型数据库,它具有高可用、高性能、可水平扩展等特点。以下是OceanBase 数据库使用过程中可能遇到的一些常见问题及其解答的汇总,以帮助用户更好地理解和使用这款数据库产品。
|
消息中间件 Docker 微服务
RabbitMQ入门指南(十一):延迟消息-延迟消息插件
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了DelayExchange插件、延迟消息插件实现延迟消息等内容。
2141 0
|
应用服务中间件 nginx 微服务
SpringCloud解决feign调用token丢失问题
【5月更文挑战第2天】在feign调用中可能会遇到如下问题: * 同步调用中,token丢失,这种可以通过创建一个拦截器,将token做透传来解决 * 异步调用中,token丢失,这种就无法直接透传了,因为子线程并没有**token**,这种需要先将token从父线程传递到子线程,再进行透传
1083 3
|
9月前
|
JSON 供应链 搜索推荐
淘宝APP分类API接口:开发、运用与收益全解析
淘宝APP作为国内领先的购物平台,拥有丰富的商品资源和庞大的用户群体。分类API接口是实现商品分类管理、查询及个性化推荐的关键工具。通过开发和使用该接口,商家可以构建分类树、进行商品查询与搜索、提供个性化推荐,从而提高销售额、增加商品曝光、提升用户体验并降低运营成本。此外,它还能帮助拓展业务范围,满足用户的多样化需求,推动电商业务的发展和创新。
266 5
|
11月前
|
机器学习/深度学习 分布式计算 算法
【大数据分析&机器学习】分布式机器学习
本文主要介绍分布式机器学习基础知识,并介绍主流的分布式机器学习框架,结合实例介绍一些机器学习算法。
1287 6
|
存储 块存储
ceph分布式存储系统常见术语篇
关于Ceph分布式存储系统的常见术语解释和概述。
1072 1
ceph分布式存储系统常见术语篇
springboot全局异常处理BasicErrorController和RestControllerAdvice
springboot全局异常处理BasicErrorController和RestControllerAdvice
|
Rust 安全 测试技术
Rust并发编程实践:快速入门系统级编程
Rust是一门现代的系统编程语言,它的设计目标是提供安全性、并发性和高性能。Rust的出现是为了解决其他编程语言在这些方面存在的一些问题和挑战。
|
分布式计算 数据管理 Java
Zookeeper(持续更新) VIP-01 Zookeeper特性与节点数据类型详解
官方文档上这么解释zookeeper,它是一个分布式协调框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
448 1
Zookeeper(持续更新) VIP-01 Zookeeper特性与节点数据类型详解