LogBack学习记录(二)体系架构

本文详细介绍了logback日志框架的组成、实现逻辑、关键组件(Logger、Appender、Layout)及其工作原理,包括如何通过配置控制日志级别、输出目标和样式。文章还讨论了提高日志效率的方法,如参数化输出和避免不必要的计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

logback由三个jar包组成:

 logback-core, logback-classic and logback-access。

logback-core是其他两个部分的基础,logback-classic 继续了core,并且实现了SLF4J 的接口,在一般应用中使用这两个就足够了。 logback-access提供远程日志的功能,一般用不到。


logback 的实现逻辑由三个部分组成:

Logger ,Appender ,Layout 。logger来源于 logback-classic包,而Appender 和Layout 则来自于core包。


Logger 

可以将整个系统的日志管理输出看成一个树,如果对这颗树不做任何控制,那么将输出系统中的所有日志。而每个logger就相当于这个树的每个分支,如上一张的例子中

Logger logger = LoggerFactory.getLogger(HelloWorld.class);

这里的logger是HelloWorld.class 的这个分支。并且这种树状结构构成了子父级的关系。如以“com.foo”命名的logger就是‘com.foo.bar’的父亲。真个logger的根级节点可以通过 如下代码获取:

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

在这种继承树的结构下,如果一个logger没有被赋予级别,那么他就会继承其父类的级别。

Example 1

Logger nameAssigned levelEffective level
rootDEBUGDEBUG
XnoneDEBUG
X.YnoneDEBUG
X.Y.ZnoneDEBUG
如果被赋予级别了,那么将采用赋予的级别

Example 2

Logger nameAssigned levelEffective level
rootERRORERROR
XINFOINFO
X.YDEBUGDEBUG
X.Y.ZWARNWARN
如果没有赋予级别,将采用其最近的父级别:

Example 4

Logger nameAssigned levelEffective level
rootDEBUGDEBUG
XINFOINFO
X.YnoneINFO
X.Y.ZnoneINFO

一条logger一般通过logger.info("msg"),logger.error("msg")等方式在代码中进行输出,info表示这条日志的级别就是info级别的,以此类推。需要注意的是,这条日志输出语句最终能否得到执行输出取决于两个方面:

一,logger 的输出时设置的级别(通过,logger.info("msg"),logger.error("msg")等方法得出

二,logback对于该logger的输出控制级别。

只有当控制级别高于设置级别时,该条日志输出语句才能运行。logback的日志级别的关系关系如下:

 TRACE < DEBUG < INFO <  WARN < ERROR.

通过一个例子说明,相关源码位于chapt2中(LogLeverTest)。

Logger logger = (Logger) LoggerFactory.getLogger("com.foo");
//将日志级别设置为info级别的
logger.setLevel(Level. INFO);
Logger barlogger = (Logger)  LoggerFactory.getLogger("com.foo.Bar");
//WARN >= INFO 可以输出
logger.warn("Low fuel level.");
//  DEBUG < INFO. 无法输出
logger.debug("Starting search for nearest gas station.");
//barlogger 继承 com.foo的级别,采用info级别
// INFO >= INFO 可以输出 
barlogger.info("Located nearest gas station.");
//  DEBUG < INFO.无法输出 
barlogger.debug("Exiting gas station search");


需要注意的是,通过相同名字获取的logger是同一个对象,这对于提高系统的效率很有好处。一般情况下,我们需要对特定的类进行日志输出,为了避免重复问题,建议当采用名称的方式创建时,采用类的完整路径的方式进行命名。

Logger x = LoggerFactory.getLogger("wombat"); 
Logger y = LoggerFactory.getLogger("wombat");
这里的x,y指向同一个对象。
还有,虽然logger存在这种类似树的结构,但是并不要求必须先创建父类logger然后采用创建子类logger,完全可以按照任意顺序尽心创建。

此外在LogLeverTest的例子中,采用logger.setLevel(Level. INFO);的方式进行了logger的级别设置,在实际的使用中一般将通过配置文件的方式进行设置。

Appenders and Layouts

除了可以通过logger来控制日志是否进行输出外,可以通过 appender来确定日志输出的目标。日志输出目标可以是控制台,文件,远程服务器,mysql等等,并且一个logger可以绑定多个appender目标。
logger通过addAppender方法来添加appender。logger将会向每一个被添加的appender输出日志。需要注意的是,appender也存在树继承问题,如:如果console被配置到了root logger 中,那么系统中的任意的一级logger都将在console中输出。如果一个logger,命名为filelog添加了一个输出到某个文档的appender,那么filelog的子类将不但输出到console还要输出到该文档中。当然也可以通过将additivity 设置为false来关闭这中日志输出方式。当关闭后,将只输出到指定的appender中。

可以通过 layout  来对输出的样式进行控制。通过将layout与appender进行关联,而appender则与logger进行关联,从而控制了logger的输出目标和样式。PatternLayout 是一种标准的logback样式,可以通过对其一些参数设置(类似于c语言的printf 方法)来实现个性化的日志输出。

For example, the PatternLayout with the conversion pattern "%-4relative [%thread] %-5level %logger{32} - %msg%n" will output something akin to:

176  [main] DEBUG manual.architecture.HelloWorld2 - Hello world.

The first field is the number of milliseconds elapsed since the start of the program. The second field is the thread making the log request. The third field is the level of the log request. The fourth field is the name of the logger associated with the log request. The text after the '-' is the message of the request.


提高日志效率及参数化的输出支持

很多情况下,我们会采用如下方式进行日志的输出

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

但是当日志级别升级为info或者更高级别时,这条语句是得不到运行的。但是String.valueof却需要每次都运行,这样会浪费系统资源,因此建议采用如下方式进行日志的输出编写方式。

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

logback支持参数式的输出样式,通过例子即可明白:
logger.debug("The new entry is {}.", entry);
当然采用这种参数的方式也可以降低系统的消耗,如果这条语句不执行,那么entty的tostring方法将不会执行。
多参数的方式
logger.debug("The new entry is {}. It replaces {}.", entry, oldEntry);

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





内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核和精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围和快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项和误差源分析,旨在帮助工程师更好地理解和应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师和技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式数字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间和转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收和泄漏电流等因素对测量准确性的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值