老板下了死命令,要把日志系统切换到Logback(1)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 老板下了死命令,要把日志系统切换到Logback

Log4j 介绍过了,SLF4J 也介绍过了,那接下来,你懂的,Logback 就要隆重地登场了,毕竟它哥仨有一个爹,那就是巨佬 Ceki Gulcu。


就在昨天,老板听我说完 Logback 有多牛逼之后,彻底动心了,对我下了死命令,“这么好的日志系统,你还不赶紧点,把它切换到咱的项目当中!”


我们项目之前用的 Log4j,在我看来,已经足够用了,毕竟是小公司,性能上的要求没那么苛刻。




01、Logback 强在哪


1)非常自然地实现了 SLF4J,不需要像 Log4j 和 JUL 那样加一个适配层。


image.png


2)Spring Boot 的默认日志框架使用的是 Logback。一旦某款工具库成为了默认选项,那就说明这款工具已经超过了其他竞品。


image.png


注意看下图(证据找到了,来自 Spring Boot 官网):


image.png


也可以通过源码的形式看得到:


image.png


3)支持自动重新加载配置文件,不需要另外创建扫描线程来监视。


4)既然是巨佬的新作,那必然在性能上有了很大的提升,不然呢?


02、Logback 使用示例


第一步,在 pom.xml 文件中添加 Logback 的依赖:


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



Maven 会自动导入另外两个依赖:


image.png


logback-core 是 Logback 的核心,logback-classic 是 SLF4J 的实现。


第二步,来个最简单的测试用例:


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * @author 微信搜「沉默王二」,回复关键字 PDF
 */
public class Test {
    static Logger logger = LoggerFactory.getLogger(Test.class);
    public static void main(String[] args) {
        logger.debug("logback");
    }
}



Logger 和 LoggerFactory 都来自 SLF4J,所以如果项目是从 Log4j + SLF4J 切换到 Logback 的话,此时的代码是零改动的。


运行 Test 类,可以在控制台看到以下信息:


12:04:20.149 [main] DEBUG com.itwanger.Test - logback


在没有配置文件的情况下,一切都是默认的,Logback 的日志信息会输出到控制台。可以通过 StatusPrinter 来打印 Logback 的内部信息:


LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory();

StatusPrinter.print(lc);



在 main 方法中添加以上代码后,再次运行 Test 类,可以在控制台看到以下信息:


12:59:22.314 [main] DEBUG com.itwanger.Test - logback

12:59:22,261 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]

12:59:22,262 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]

12:59:22,262 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml]

12:59:22,268 |-INFO in ch.qos.logback.classic.BasicConfigurator@5e853265 - Setting up default configuration.



也就是说,Logback 会在 classpath 路径下先寻找 logback-test.xml 文件,没有找到的话,寻找 logback.groovy 文件,还没有的话,寻找 logback.xml 文件,都找不到的话,就输出到控制台。


一般来说,我们会在本地环境中配置 logback-test.xml,在生产环境下配置 logback.xml。


第三步,在 resource 目录下增加 logback-test.xml 文件,内容如下所示:


<configuration debug="true">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %relative [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>



Logback 的配置文件非常灵活,最基本的结构为 <configuration> 元素,包含 0 或多个 <appender> 元素,其后跟 0 或多个 <logger> 元素,其后再跟最多只能存在一个的 <root> 元素。


image.png


1)配置 appender,也就是配置日志的输出目的地,通过 name 属性指定名字,通过 class 属性指定目的地:


ch.qos.logback.core.ConsoleAppender:输出到控制台。

ch.qos.logback.core.FileAppender:输出到文件。

ch.qos.logback.core.rolling.RollingFileAppender:文件大小超过阈值时产生一个新文件。

除了输出到本地,还可以通过 SocketAppender 和 SSLSocketAppender 输出到远程设备,通过 SMTPAppender 输出到邮件。甚至可以通过 DBAppender 输出到数据库中。


encoder 负责把日志信息转换成字节数组,并且把字节数组写到输出流。


pattern 用来指定日志的输出格式:


%d:输出的时间格式。

%thread:日志的线程名。

%-5level:日志的输出级别,填充到 5 个字符。比如说 info 只有 4 个字符,就填充一个空格,这样日志信息就对齐了。

反例(没有指定 -5 的情况):


image.png


%logger{length}:logger 的名称,length 用来缩短名称。没有指定表示完整输出;0 表示只输出 logger 最右边点号之后的字符串;其他数字表示输出小数点最后边点号之前的字符数量。

%msg:日志的具体信息。

%n:换行符。

%relative:输出从程序启动到创建日志记录的时间,单位为毫秒。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
存储 数据采集 数据处理
【Flume拓扑揭秘】掌握Flume的四大常用结构,构建强大的日志收集系统!
【8月更文挑战第24天】Apache Flume是一个强大的工具,专为大规模日志数据的收集、聚合及传输设计。其核心架构包括源(Source)、通道(Channel)与接收器(Sink)。Flume支持多样化的拓扑结构以适应不同需求,包括单层、扇入(Fan-in)、扇出(Fan-out)及复杂多层拓扑。单层拓扑简单直观,适用于单一数据流场景;扇入结构集中处理多源头数据;扇出结构则实现数据多目的地分发;复杂多层拓扑提供高度灵活性,适合多层次数据处理。通过灵活配置,Flume能够高效构建各种规模的数据收集系统。
30 0
|
2月前
|
存储 消息中间件 人工智能
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
早期 MiniMax 基于 Grafana Loki 构建了日志系统,在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案,并基于阿里云数据库 SelectDB 版内核 Apache Doris 升级了日志系统,新系统已接入 MiniMax 内部所有业务线日志数据,数据规模为 PB 级, 整体可用性达到 99.9% 以上,10 亿级日志数据的检索速度可实现秒级响应。
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
|
2月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
29天前
|
JSON 缓存 fastjson
一行日志引发的系统异常
本文记录了一行日志引发的系统异常以及作者解决问题的思路。
|
5天前
使用装饰器实现自动化日志系统
使用装饰器实现自动化日志系统
|
2月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
|
2月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
|
2月前
|
存储 监控 数据可视化
在Linux中,如何查看系统日志?
在Linux中,如何查看系统日志?
|
2月前
|
监控 安全 Linux
在Linux中,某个账号登陆linux后,系统会在哪些日志文件中记录相关信息?
在Linux中,某个账号登陆linux后,系统会在哪些日志文件中记录相关信息?
|
2月前
|
XML Java API
Java日志通关(四) - Logback 介绍
作者日常在与其他同学合作时,经常发现不合理的日志配置以及五花八门的日志记录方式,后续作者打算在团队内做一次Java日志的分享,本文是整理出的系列文章第四篇。
下一篇
无影云桌面