Logback简单使用

Logback 日志框架介绍

正如你所知,开发者拥有大量日志工具可供选择。本节中,我们将学习一个非常流行的日志库 —— Logback。它是 Log4j 日志库的继任者,基于相似的理念构建。Logback 在同步和异步日志记录方面都非常快速,并提供了很多实用的功能,因此适用于任何规模的项目。

与直接使用 System.out 打印信息相比,Logback 最大的不同在于它的 每个日志记录器(Logger)都有一个上下文(context)。这个上下文可以启用或禁用某些日志消息,还负责创建 Logger 实例并管理它们的层次结构。接下来我们就来详细了解这些功能。


将 Logback 添加到项目中

安装 Logback 十分简单,只需将依赖添加到 Maven 或 Gradle 即可。

要开始使用 Logback,你需要添加 logback-classic 依赖。

Maven 示例:

pom.xml 中添加以下内容:

<dependencies><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency>
</dependencies>

这表示你引入了 Logback 核心的实现包 logback-classic

Gradle 示例:

build.gradle 中添加以下内容:

dependencies {implementation ("ch.qos.logback:logback-classic:1.2.11")
}

这个依赖会自动传递引入两个其他库:slf4j-apilogback-core

  • SLF4J(Simple Logging Facade for Java)是一个为各种日志库提供统一接口的“门面”框架。它提供简单的日志 API,而 Logback 是其原生实现。

  • logback-core 是 Logback 的基础库,提供了若干现成的类,例如:

    • ConsoleAppender: 将日志事件输出到标准控制台(System.outSystem.err);

    • FileAppender: 将日志事件输出到文件;

    • RollingFileAppender: 当满足特定条件时,将日志滚动写入新文件。

  • logback-classic 还提供了可以将日志发送到外部系统的类,例如:

    • SMTPAppender: 在特定事件发生后将日志通过邮件发送;

    • DBAppender: 将日志存入数据库表。


基本日志记录

我们来创建一个名为 Example 的类,并声明几个 Logger 对象:

import org.slf4j.Logger
import org.slf4j.LoggerFactoryclass Example {private val LOG_1: Logger = LoggerFactory.getLogger(Example::class.java)private val LOG_2: Logger = LoggerFactory.getLogger("com.example.Example")init {LOG_1.info("Information from LOG_1")LOG_2.warn("Warning from LOG_2")LOG_1.info("Are the loggers the same? {}", LOG_1 === LOG_2)}
}fun main() {Example()
}

代码解释:

如你所见,我们并未直接引用 Logback 的任何类,而是使用 SLF4J 提供的接口,SLF4J 再将日志操作交由 Logback 实现。

使用 LoggerFactory.getLogger() 创建 Logger 时,可以传入类对象或字符串。两者都作为日志记录器的名称。如果同名 Logger 已存在,会复用它;否则会新建一个。

Logger 提供 tracedebuginfowarnerror 等方法来输出对应级别的日志。

日志默认输出的内容包括:时间戳、线程名、日志级别、Logger 名称、日志信息。这些都可以自定义,稍后会介绍配置方式。


日志消息参数化

Logback 支持在日志消息中添加对象或变量。这可以帮助你追踪出错位置和原因。

示例:

import org.slf4j.Logger
import org.slf4j.LoggerFactoryclass Example {private val LOG: Logger = LoggerFactory.getLogger(Example::class.java)init {val result = "Any operation"LOG.info("To track the value of a variable. The result is $result")}
}fun main() {Example()
}

这段代码展示了如何将变量插入到日志中。

此外,我们还可以记录异常信息:

import org.slf4j.Logger
import org.slf4j.LoggerFactoryclass Example {private val LOG: Logger = LoggerFactory.getLogger(Example::class.java)init {val number = 1val divisor = 0try {val result = number / divisor} catch (e: ArithmeticException) {LOG.error("Something went wrong with divisor $divisor\n$e")}}
}fun main() {Example()
}

说明:

Logback 能提取堆栈跟踪信息。如果你将异常对象作为日志方法的最后一个参数传入,即可自动记录异常详情,无需在消息中显式添加占位符。


配置 Logger

Logback 支持使用 XML 或 Groovy 文件进行配置。我们使用 XML 配置文件,名为 logback.xml,应放在资源目录(resources)中。

控制台输出配置:

<configuration><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss} %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="info"><appender-ref ref="console" /></root>
</configuration>
说明:
  • <appender>:配置日志输出方式;

    • name:定义 appender 的名称;

    • class:指定输出到控制台的类。

  • <encoder>:设置日志输出格式;

  • %d:时间戳;

  • %level:日志级别;

  • %logger{36}:日志器名称(最多 36 个字符);

  • %msg:日志消息;

  • <root>:定义默认根日志器,指定日志级别并绑定 appender

文件输出配置:

<configuration><appender name="file" class="ch.qos.logback.core.FileAppender"><file>${user.dir}/logs/example.log</file><encoder><pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="info"><appender-ref ref="file" /></root>
</configuration>

这里我们使用 FileAppender 将日志输出到 ${user.dir}/logs/example.log。如果该文件不存在,会自动创建。


日志级别配置

Logback 允许为 特定类或包设置不同的日志级别,例如:

class Example {private val LOG = LoggerFactory.getLogger(Example::class.java)fun log() {LOG.warn("WARN level message")LOG.info("INFO level message")}
}class LoggerLevelClass {private val LOG = LoggerFactory.getLogger(LoggerLevelClass::class.java)fun log() {LOG.debug("DEBUG level message")LOG.info("INFO level message")}
}fun main() {Example().log()LoggerLevelClass().log()
}

对应的 XML 配置:

<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
</appender><logger name="com.example" level="warn"/>
<logger name="com.example.LoggerLevelClass" level="info"/><root level="info"><appender-ref ref="console" />
</root>
</configuration>

说明:

  • 每个 logger 只会输出大于或等于当前设置级别的日志。

  • Logback 使用基于名称的层级结构,如:

    • com.logback.firstcom.logback.first.second 的父级;

    • com.logback.first.secondcom.logback.first.second.third 的父级。

  • 层级结构的最顶层是 root


总结

在本节中,你学习了 Logback 是做什么的,以及它提供了哪些功能。使用 Logback,你可以清楚地知道程序执行的每一步,还可以根据需求灵活配置日志记录器、按包或类追踪操作、快速发现并定位错误。

如需进一步了解 Logback 的配置层级和使用技巧,建议查阅官方文档。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89956.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫实战:研究langid.py库相关技术

一、引言 在当今全球化的网络环境下,互联网上的内容呈现出多语言的特点。对于许多自然语言处理 (NLP) 任务,如文本分类、情感分析和信息检索,准确识别文本的语言是首要步骤。网络爬虫作为获取互联网内容的重要工具,结合语言识别技术,可以为多语言信息处理提供丰富的数据来…

打车代驾 app 派单接单系统模块搭建

一、逻辑分析打车代驾 APP 的派单接单系统模块是整个应用的核心部分&#xff0c;它需要高效、准确地处理订单分配和司机接单流程&#xff0c;以确保用户能够快速得到服务&#xff0c;司机能够合理地接到订单。用户端下单逻辑&#xff1a;用户打开 APP&#xff0c;输入出发地、目…

Java Stream API性能优化:原理深度解析与实战指南

Java Stream API性能优化&#xff1a;原理深度解析与实战指南 技术背景与应用场景 随着大数据量处理和高并发场景的普及&#xff0c;传统的集合遍历方式在代码可读性和性能上逐渐显现瓶颈。Java 8引入的Stream API&#xff0c;通过声明式的流式编程极大提升了开发效率和可读性&…

Nginx配置proxy protocol代理获取真实ip

Nginx配置proxy protocol 文章目录Nginx配置proxy protocol前言一、PROXY Protocol协议二、配置方法代理服务器配置http模块代理​​Stream 模块​代理测试配置是否生效端口检查测试ip记录验证http验证tcp注意事项和理解误区应用程序机器配置总结前言 在现代开发中有很多场景需…

什么是商业智能BI数据分析的指标爆炸?

指标爆炸这个词大家可能都是第一次听说&#xff0c;指标怎么会爆炸呢&#xff1f;其实这个是我们很多年前在一些商业智能BI项目上总结出来的一种场景或者现象&#xff0c;就是过于的开放给业务人员在BI自助分析过程中创造了很多衍生性的分析指标&#xff0c;结果就造成了前端指…

Spring AI 系列之十八 - ChatModel

之前做个几个大模型的应用&#xff0c;都是使用Python语言&#xff0c;后来有一个项目使用了Java&#xff0c;并使用了Spring AI框架。随着Spring AI不断地完善&#xff0c;最近它发布了1.0正式版&#xff0c;意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说…

Linux学习之Linux系统权限

在上一篇的内容中我们学习到了Linux系统命令相关的知识及其相关的扩展内容&#xff0c;本期我们将学习Linux基础的另一个重要部分&#xff1a;Linux系统权限管理 作者的个人gitee&#xff1a;楼田莉子 (riko-lou-tian) - Gitee.com 目录 权限概念及必要性 什么是权限 为什么要…

Web3.0 能为你带来哪些实质性的 改变与突破

如今各种大厂裁员消息层出不穷&#xff0c;今年又添飞书、剪映、微软、思科... 这有一张网友整理的去年互联网大厂裁员裁员信息表&#xff1a; 目前国内很多大厂都在裁员&#xff0c;非常现实、且越来越多 35 技术人&#xff0c;正在面临这样的问题&#xff0c;那么Web3.0 确实…

doker centos7安装1

1.什么是doker Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;然后发布到任何支持 Docker 的操作系统上&#xff0c;实现 “一次构建&#xff0c;到处运行”。 容器是一种轻量级的虚拟化技术&#xff0c…

自动化面试题

1、什么是测试套件测试套件是多个测试用例的集合。2、搭建接口自动化框架中&#xff0c;你遇到最大的难点是什么&#xff0c;以及怎么解决的?测试数据动态管理难点:接口依赖动态参数(如Token、订单ID)&#xff0c;数据无法硬编码.解决方案:使用关联提取(如正则提取响应中的Tok…

【Linux】LVS(Linux virual server)环境搭建

一、LVS的运行原理1.1 LVS简介LVS:Linux Virtual Server&#xff0c;负载调度器&#xff0c;内核集成&#xff0c;章文嵩&#xff0c;阿里的四层SLB(Server LoadBalance)是基于LVSkeepalived实现LVS 官网: http://www.linuxvirtualserver.org/ LVS 相关术语 VS: Virtual Server…

算法竞赛备赛——【图论】求最短路径——Dijkstra

Dijkstra 用来计算从一个点到其他所有点的最短路径的算法&#xff0c;是一种单源最短路径算法。也就是说&#xff0c;只能计算起点只有一个的情况。Dijkstra的时间复杂度是O (|v|^2)&#xff0c;它不能处理存在负边权的情况。 邻接矩阵存图 #include<iostream> using …

影刀 RPA:批量修改 Word 文档格式,高效便捷省时省力

在日常办公和文档处理中&#xff0c;Word 文档格式的统一和规范是许多企业和个人用户的重要需求。无论是撰写报告、制作提案&#xff0c;还是整理资料&#xff0c;都需要确保文档格式的一致性。然而&#xff0c;手动修改多个 Word 文档的格式不仅耗时费力&#xff0c;还容易因疏…

GitLab 社区版 10.8.4 安装、汉化与使用教程

一、GitLab 安装 GitLab 提供了集成所需软件的 RPM 包&#xff0c;简化了安装流程。我们选择安装社区版&#xff08;CE&#xff09;10.8.4&#xff0c;可通过官方网站或国内镜像源&#xff08;如清华镜像&#xff09;获取安装包。 1. 准备工作 首先创建工具目录并进入&#…

[硬件电路-64]:模拟器件 -二极管在稳压电路中的应用

二极管在稳压电路中的应用主要基于其单向导电性和特定类型二极管&#xff08;如稳压二极管&#xff09;的电压稳定特性。以下是详细解释&#xff1a;一、普通二极管的稳压作用&#xff08;有限场景&#xff09;正向导通压降的利用&#xff1a;原理&#xff1a;普通二极管在正向…

【Linux】重生之从零开始学习运维之Nginx

安装apt/yum安装apt imstall nginx yum install nginxRocky源码编译安装基础编译环境yum install gcc make gcc-c glibc glibc-devel pcre pcre-devel openssl openssldevel systemd-devel zlib-devel yum install libxml2 libxml2-devel libxslt libxslt-devel php-gd gd-deve…

主流 MQ 的关键性能指标

常用消息队列&#xff08;MQ&#xff09;的“数量级”通常围绕吞吐量&#xff08;TPS&#xff0c;每秒处理消息数&#xff09;、消息堆积能力、延迟三个核心指标展开&#xff0c;不同MQ因设计目标&#xff08;高吞吐、低延迟、高可靠等&#xff09;不同&#xff0c;数量级差异显…

[NIPST AI]对抗性机器学习攻击和缓解的分类和术语

原文link&#xff1a;https://nvlpubs.nist.gov/nistpubs/ai/NIST.AI.100-2e2025.pdf Introduction 人工智能&#xff08;AI&#xff09;系统在过去几年中持续全球扩展。这些系统正在被众多国家开发并广泛部署于各自的经济体系中&#xff0c;人们在生活的许多领域都获得了更多使…

[深度学习] 大模型学习3上-模型训练与微调

在文章大语言模型基础知识里&#xff0c;模型训练与微调作为大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;应用构建的主要方式被简要提及&#xff0c;本系列文章将从技术原理、实施流程及应用场景等维度展开深度解析。相关知识的进一步参考见&#x…

Claude Code 启动提示 Note: Claude Code might not be available in your country. 解决

如下图所示 主播参考了在别的地方看来的解决方案&#xff08;并非主播不想标注来源&#xff0c;主要是忘记是哪里看来的了&#xff0c;下班就忘记了&#xff0c;懒得找了&#x1f62d;&#xff0c;如果后续找到会补上的&#xff09;。 好了&#xff0c;开始正文&#xff0c;开始…