Java技术栈 —— Log4j 2、Logpack、SLF4j日志框架介绍

news2024/11/16 8:27:41

Log4j 2、Logpack、SLF4j日志框架介绍

  • Log4j 2、Logpack、SLF4j日志框架,及其区别
        • 1.1 Log4j 2
          • 1.1.1 日志级别
          • 1.1.2 日志输出目标位置
          • 1.1.3 日志刷新机制
          • 1.1.4 结构化打印日志
          • 1.1.5 异步打印日志
          • 1.1.6 在Cloud云环境汇集日志信息
        • 1.2 LogPack
        • 1.3 SLF4j
        • 1.4 区别

Log4j 2、Logpack、SLF4j日志框架,及其区别

1.1 Log4j 2

注意二者在包名上的区别,考虑到目前使用的大多是Log4j 2,Log4j的使用就不单开一节做介绍了。
Log4j : org.apache.log4j.xxx
Log4j 2 : org.apache.logging.log4j.xxx

1.1.1 日志级别

你可能还会见到Log4j 2的说法,Log4j 2是Log4j的更新一代版本。总共有六个日志级别,数值越小越严重。

(1)TRACE (600) : 最不严重的日志级别,通常用来打印细粒度信息,如进入与退出一个函数的过程信息、变量值信息以及其它可以帮助你理解代码之间内部工作关系的细节信息。
(2)DEBUG (500) : 可以用来追踪一个函数是否有正确执行。
(3)INFO (400) : it is used for informational messages that record events that occur during the normal operation of your application,such as user authentication, API calls, or database access. These messages help you understand what’s happening within your application.
(4)WARN (300) : events logged at this level indicate potential issues that might require your attention before they become significant problems.
(5)ERROR (200) : it is used to record unexpected errors that occur during the course of program execution.
(6)FATAL (100) : this is the most severe log level, and it indicates an urgent situation affecting your application’s core component that should be addressed immediately.
在这里插入图片描述
打印日志有个规律,配置文件如果要打印TRACE级别,那么比TRACE级别高的DEBUG级别一定不可避免会被打印出来,其它的以此类推。

除了这六个级别以外,你也可以自定义级别,定义方法如下

package com.example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Level;

public class App {
    protected static final Logger logger = LogManager.getLogger();

    public static void main(String[] args) {
        logger.log(Level.getLevel("VERBOSE"), "a verbose message");
    }
}
1.1.2 日志输出目标位置

还有就是log4j可以定义你的日志输出目标位置,是console控制台、还是files文件、亦或是database数据库或者云环境等。假设下面这段内容是log4j2.xml的文件内容,最终的日志会输出到当前项目根目录下的./logs/app.log文件中。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <File name="file" fileName="./logs/app.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="file" />
        </Root>
    </Loggers>
</Configuration>
1.1.3 日志刷新机制

同时,为了防止文件无限度的增长,需要让log4j开辟一个新文件去存储,这可以用RollingFile来实现,即文件滚动。还是在上一段xml的基础上,修改了一点内容。那么可以看到,日志会输出至.gz后缀的压缩文件,一旦文件到了1KB,就会新建另一个.gz后缀的压缩文件,这里选1KB是为了方便运行观察效果,实际中肯定是选百MB或GB级别的。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">

    <Appenders>
        <RollingFile name="rolling" fileName="logs/app.log"
            filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="250 MB" />
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="rolling" />
        </Root>
    </Loggers>

</Configuration>

除了根据大小刷新日志,还有定时刷新日志的功能,更多功能具体请看参考文章[1],不过这篇文章在cron表达式与OnStartupTriggeringPolicy处有错误,不能全部都信。

1.1.4 结构化打印日志

除了PatternLayout规定的格式,我们还可以用JSONXML格式来打印日志,可以用JsonLayout来打印JSON格式的日志,首先要添加jar包依赖

<!--pom.xml-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.15.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.15.0</version>
    </dependency>
<!--log4j2.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">

    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <JsonLayout />
        </Console>
    </Appenders>

    <Loggers>
        <Root level="trace">
            <AppenderRef ref="console" />
        </Root>
    </Loggers>

</Configuration>

运行

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;

public class Log4j_JSON {
    protected static final Logger logger = LogManager.getLogger();
    public static void main(String[] args) {
        ThreadContext.put("orderNumber", "1234567890");
        ThreadContext.put("buyerName", "jack");
        ThreadContext.put("destination", "xxxxxxxxxx");

        logger.info("Order shipped successfully."+ThreadContext.getContext());

        ThreadContext.clearAll();
    }
}

这是打印效果

{
  "instant" : {
    "epochSecond" : 1702643420,
    "nanoOfSecond" : 977000000
  },
  "thread" : "main",
  "level" : "INFO",
  "loggerName" : "lyp.basic.logFrame.Log4j_JSON",
  "message" : "Order shipped successfully.{buyerName=jack, destination=xxxxxxxxxx, orderNumber=1234567890}",
  "endOfBatch" : false,
  "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
  "threadId" : 1,
  "threadPriority" : 5
}

你也可以配置自己的json模版,具体看文章里的教程。

1.1.5 异步打印日志

什么是同步(Synchronism)?一件一件事情来,等结果执行完成再开始下一件。
什么是异步(ASynchronism,前面就多了个A)?事情一起开始,有结果再汇报,然后再处理。我们的日常生活就是异步的,所以不要觉得异步反人性,它可能反编程直觉,但绝对是符合事物本质逻辑的。 所以打日志这种事情,交给手下的日志框架去完成,打印完了汇报下就可以,这就是异步打印日志。但异步打印日志也有缺点,比如

(1) 内存占比增加
(2) 系统崩溃时,可能丢失数据
(3) 日志信息顺序混乱,这可能给debug带来困难
(4)
这里文章[1]没讲明白,另找文章。

1.1.6 在Cloud云环境汇集日志信息

Logtail: Cloud-based log management platforms.

参考视频或文章链接
[1] How to Get Started with Log4j for Logging in Java
[2] log4j - Apache
[3] 《详解log4j2(上) - 从基础到实战》
[4] Example code of log4j log4j2 and slf4j
[5] 异步打印日志缺依赖看这篇《log4j2 AsyncLogger错误 NoClassDefFoundError: com/lmax/disruptor/EventFactory》
1.2 LogPack

略,有兴趣请看文章。

参考视频或文章链接
Introduction to SLF4J,也包含一些对Logpack的介绍
A Guide To Logback
1.3 SLF4j

SLF4j = Simple Logging Facade for Java (abbreviated SLF4J)Facade意思为房屋外观,还有一种设计模式叫外观模式(也叫门面模式),名字正好就是Facade Pattern,故SLF4j的全部意思是 “Java的简单日志外观”SLF4j支持不同的日志框架(e.g., java.util.logging, logback, Log4j)。

It offers a generic API, making the logging independent of the actual implementation.This allows for different logging frameworks to coexist.它提供了一个通用的API接口,使得logging本身是独立于具体实现的。这使得SLF4J可以运行各种不同的日志框架共存

SLF4J如何引用Log4j 2?

参考视频或文章链接
SLF4J Manaul - Offical Website
Introduction to SLF4J
Log4j 2 SLF4J Binding - Apache
1.4 区别

首先,Log4j 2SLF4j并非同一事物,虽然在搜索Log4j 2时,时常会搜索出混杂了SLF4jLog4j 2的内容。

参考视频或文章链接
Java Logging Frameworks Comparison: SLF4j vs Log4j vs Logback vs Log4j2 [Differences]
《最通俗易懂的 JAVA slf4j,log4j,log4j2,logback 关系与区别以及完整集成案例》

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

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

相关文章

tcp连接全过程各种状态详解

文章目录 TCP的一些重要特性tcp连接全过程各种状态参考资料 TCP的一些重要特性 TCP是一种可靠、面向连接、全双工、流控制、拥塞控制、有序传输、无差错传输、无重复传输、无丢失传输等特点的协议。为了实现这些特点&#xff0c;TCP必须对上层应用程序发送的数据进行分段、重组…

玩转大数据18:大规模数据处理与分布式任务调度

引言 在数字化时代&#xff0c;数据成为了一种宝贵的资源&#xff0c;对于企业和组织来说&#xff0c;如何有效地处理和分析这些数据成为了关键的竞争力。大规模数据处理与分布式任务调度作为大数据处理的核心技术&#xff0c;为解决这一问题提供了有效的解决方案。 随着数据…

Python如何匹配库的版本

目录 1. 匹配库的版本 2. Python中pip&#xff0c;库&#xff0c;编译环境的问题回答总结 2.1 虚拟环境 2.2 pip&#xff0c;安装库&#xff0c;版本 1. 匹配库的版本 &#xff08;别的库的版本冲突同理&#xff09; 在搭建pyansys环境的时候&#xff0c;安装grpcio-tools…

阿赵UE学习笔记——1.安装UE

大家好&#xff0c;我是阿赵&#xff0c;这是一个新的开始&#xff0c;这次先简单介绍一下UE的安装方法。   安装Unreal Engine(简称UE)&#xff0c;需要先按照一个EPIC Games Launcher。 这个其实是EPIC的游戏中心&#xff0c;你可以理解成和Steam差不多&#xff0c;是一个…

盲盒小程序如何搭建?

随着移动互联网的发展&#xff0c;为了让消费者方便快捷地体验盲盒抽取乐趣&#xff0c;线上盲盒系统的开发成为了一个必要的过程。 今天本文将为大家介绍盲盒系统的搭建过程。 盲盒系统搭建过程 开发需求 在开发盲盒系统前&#xff0c;需要对盲盒市场深入分析&#xff0c;了…

IntelliJ IDEA 运行 若依分离版后端

一、本地运行 一、选择打开IntelliJ IDEA项目 二、选择若依项目 如&#xff1a;java123 三、等待右下角的准备工作&#xff08;有进度条的&#xff09;完成 四、修改MySQL 五、修改资源上传目录 六、修改redis 七、然后点击运行 八、成功图 九、测试访问 二、部署服务器运行 …

Linux-----12、时间日期

# 时间日期 # 时区设置 在Linux (opens new window)系统中&#xff0c;默认使用的是UTC时间。 即使在安装系统的时候&#xff0c;选择的时区是亚洲上海&#xff0c;Linux默认的BIOS时间&#xff08;也称&#xff1a;硬件时间&#xff09;也是UTC时间 (opens new window)。 在…

uniapp 单选按钮 选中默认设备

需求1&#xff1a;选中默认设备&#xff0c;113 和114 和139都可以选中一个默认设备 选中多个默认设备方法&#xff1a; async toSwitch(typeItem, title) {const res await this.setDefaultDev(typeItem.ibdr_devsn, typeItem.ibdr_pid)if (!res) {this.common.toast(切换默…

011 数据结构_哈希

前言 本文将会向你介绍哈希概念&#xff0c;哈希方法&#xff0c;如何解决哈希冲突&#xff0c;以及闭散列与开散列的模拟实现 1. 哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经…

Spring容器中scope为prototype类型Bean的回收机制

文章目录 一、背景二、AutowireCapableBeanFactory 方法 autowireBean 分析三、Spring 容器中 scope 为 prototype 类型 Bean 的回收机制四、总结 一、背景 最近做 DDD 实践时&#xff0c;遇到业务对象需要交给 Spring 管理才能做一些职责内事情。假设账号注册邮箱应用层代码流…

【ARM Trace32(劳特巴赫) 使用介绍 1.2 - ARM 系统调试中常见的挑战】

请阅读【Trace32 ARM 专栏导读】 文章目录 ARM 系统调试中常见的挑战ARM 系统调试接口简例DAP-Debug Access portDAP 状态检查多核调试虚拟/物理地址Cache 数据一致性问题系统异常系统复位系统死机PC 采样Memory 采样RAM/Core Dump 分析小概率问题ARM 系统调试中常见的挑战 调试…

PyTorch官网demo解读——第一个神经网络(1)

神经网络如此神奇&#xff0c;feel the magic 今天分享一下学习PyTorch官网demo的心得&#xff0c;原来实现一个神经网络可以如此简单/简洁/高效&#xff0c;同时也感慨PyTorch如此强大。 这个demo的目的是训练一个识别手写数字的模型&#xff01; 先上源码&#xff1a; fr…

数据结构奇妙旅程之栈和队列

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

Linux---重定向命令

1. 重定向命令的介绍 重定向也称为输出重定向&#xff0c;把在终端执行命令的结果保存到目标文件。 2. 重定向命令的使用 命令说明>如果文件存在会覆盖原有文件内容&#xff0c;相当于文件操作中的‘w’模式>>如果文件存在会追加写入文件末尾&#xff0c;相当于文件…

[C++] 虚函数、纯虚函数和虚析构(virtual)

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/weixin_43197380&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 Loewen丶原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&…

http正向代理测试,nginx反向代理中转正向代理服务器

有3台服务器如下&#xff1a; 192.168.111.201&#xff08;反向代理到正向代理服务器&#xff09; 192.168.111.202&#xff08;正向代理服务器&#xff09; 192.168.111.203&#xff08;目标WEB系统&#xff09; 防火墙网络策略如图所示: 1、192.168.111.200 只能访问 192.168…

【送书活动】智能汽车、自动驾驶、车联网的发展趋势和关键技术

文章目录 前言01 《智能汽车》推荐语 02 《SoC底层软件低功耗系统设计与实现》推荐语 03 《SoC设计指南》推荐语 05 《智能汽车网络安全权威指南&#xff08;上册&#xff09;》推荐语 06 《智能汽车网络安全权威指南&#xff08;下册&#xff09;》推荐语 后记赠书活动 前言 …

普通二叉树和右倾斜二叉树--LeetCode 111题《Minimum Depth of Binary Tree》

本文将以解释计算二叉树的最小深度的思路为例&#xff0c;致力于用简洁易懂的语言详细描述普通二叉树和右倾斜二叉树在计算最小深度时的区别。通过跟随作者了解右倾斜二叉树的概念以及其最小深度计算过程&#xff0c;读者也将对左倾斜二叉树有更深入的了解。这将为解决LeetCode…

FreeRTOS学习——同步互斥

FreeRTOS学习——同步互斥 目录 FreeRTOS学习——同步互斥一、概念1.1 同步1.2 互斥 二、示例——有缺陷的同步三、示例——优化有缺陷的同步四、示例——有缺陷的互斥五、总结 一、概念 1.1 同步 在FreeRTOS中&#xff0c;同步是指任务之间按照某种规则进行协调和按序执行的…

HarmonyOS:使用MindSpore Lite引擎进行模型推理

场景介绍 MindSpore Lite 是一款 AI 引擎&#xff0c;它提供了面向不同硬件设备 AI 模型推理的功能&#xff0c;目前已经在图像分类、目标识别、人脸识别、文字识别等应用中广泛使用。 本文介绍使用 MindSpore Lite 推理引擎进行模型推理的通用开发流程。 基本概念 在进行开…