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

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

     <dependencies><!--log4j 2日志框架--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.20.0</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.20.0</version></dependency></dependencies>
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?

    <dependencies><!--slf4j框架--><!--slf4j 接口-->    <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.9</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j2-impl</artifactId><version>2.22.0</version></dependency><dependency> <!--使用slf4j框架,进行AsyncLogging异步日志打印时,若出现java.lang.NoClassDefFoundError: com/lmax/disruptor/EventHandler时需要引入--><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.4.4</version></dependency></dependencies>
参考视频或文章链接
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.mzph.cn/news/228530.shtml

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

相关文章

从数据应用案例出发,探索2024年及未来的数据科学转型

如今&#xff0c;数据科学已经取得了长足的进步&#xff01;回顾数据科学的发展史&#xff0c;19世纪&#xff0c;人们使用基本统计模型收集、存储和处理数据。后来&#xff0c;当计算机进入万千家庭&#xff0c;数字时代正式到来&#xff0c;并由此产生了大量数据。互联网上数…

数据库——关系数据的规范化:范式判断【知识点罗列+例题讲解】

知识点罗列&#xff1a; 各种范式之间的关系 1.第一范式1NF&#xff1a; 如果关系模式R中所有的属性都具有原子性&#xff0c;均是不可再分的&#xff08;一个属性不能再被分解成更小的数据单元&#xff09;&#xff0c;则称R属于第一范式&#xff0c;简称1NF&#xff0c;记作R…

基于urllib库的网页数据爬取

实验名称&#xff1a; 基于urllib库的网页数据爬取 实验目的及要求&#xff1a; 【实验目的】 通过本实验了解和掌握urllib库。 【实验要求】 1. 使用urllib库爬取百度搜索页面。 2. 使用urllib库获取百度搜索的关键字搜索结果&#xff08;关键字任选&#xff09;。 实验原理及…

vite原理

一、依赖预构建 1、为什么需要依赖预构建 CommonJS和UMD兼容性 在开发阶段中&#xff0c;vite的开发服务器将所有的代码视为原生ES模块。因此&#xff0c;vite必须先将作为CommonJS或者UMD发布的依赖项转换为ESM。 这是vite的一个特色&#xff0c;也是为什么会相对于webpack比…

[足式机器人]Part4 南科大高等机器人控制课 Ch08 Rigid Body Dynamics

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 南科大高等机器人控制课 Ch08 Rigid Body Dynamics 1. Spatial Vecocity1.1 Spatial vs. Conventional Accel1.2 Plueker Coordinate System and…

C语言学习NO.-操作符(二)二进制相关的操作符,原码、反码、补码是什么,左移右移操作符、按位与,按位或,按位异或,按位取反

一、操作符的分类 操作符的分类 算术操作符&#xff1a; 、- 、* 、/ 、%移位操作符: << >>位操作符: & | ^ 赋值操作符: 、 、 - 、 * 、 / 、% 、<< 、>> 、& 、| 、^单⽬操作符&#xff1a; &#xff01;、、–、&、*、、-、~ 、siz…

Redis 数据类型和对象机制

一、Redis 简介 Redis 是&#xff08;key-value&#xff09;的 NoSQL 数据库&#xff0c;所有的 key 都是 String ,它的 value 可以是 String、hash、list、set、zset&#xff08;有序集合&#xff09;、Bitmaps&#xff08;位图&#xff09;、HyperLogLog、GEO(地理信息定位)…

汽车清除积碳和清洗节气门

汽车清除积碳和清洗节气门 汽车需要清除积碳的部位检查积碳方法&#xff1a; 清除积碳和清洗节气门风险&#xff1a;燃油宝 第一次清除积碳1万公里2万公里3万公里--5万公里6万公里以上 汽车需要清除积碳的部位 节气门喷油嘴进气道燃烧室 检查积碳方法&#xff1a; 建议每3到5…

烦躁的广告弹窗如何在 Edge 上消失?轻松招架 3 种方法

Edge问题解决教程之广告弹窗如何消失&#xff1f; 一、前言&#xff1a;广告弹窗问题二、使用Edge浏览器内置的广告拦截功能三、安装广告拦截浏览器扩展程序四、处理恶意软件和广告弹窗网站五、总结 一、前言&#xff1a;广告弹窗问题 Edge浏览器中出现的广告弹窗问题是由恶意…

verilog语法进阶,时钟原语

概述&#xff1a; 内容 1. 时钟缓冲 2. 输入时钟缓冲 3. ODDR2作为输出时钟缓冲 1. 输入时钟缓冲 BUFGP verilog c代码&#xff0c;clk作为触发器的边沿触发&#xff0c;会自动将clk综合成时钟信号。 module primitive1(input clk,input a,output reg y); always (posed…

ES6 面试题 | 02.精选 ES6 面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

计算机网络:DNS域名解析系统

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

DevOps常用工具全家桶,实现高效运维和交付

专栏集锦&#xff0c;大佬们可以收藏以备不时之需&#xff1a; Spring Cloud 专栏&#xff1a;http://t.csdnimg.cn/WDmJ9 Python 专栏&#xff1a;http://t.csdnimg.cn/hMwPR Redis 专栏&#xff1a;http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏&#xff1a;http://t.csdni…

备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理

任务书 软件名称 版本 ubuntu 18.04 64 位 Hadoop&#xff1a;hadoop-3.1.3.tar.gz 3.1.3 Jdk&#xff1a;jdk-8u212-linux-x64.tar.gz 1.8 Spark&#xff1a;spark-3.1.1-bin-hadoop3.2.tgz 3.1.1 Hive&#xff1a;apache-hive-3.1.2-bin.tar.gz 3.1.2 MySQL …

商家收款降低费率开户指南:微信支付0.2%费率(千分之二)开通步骤

在数字支付日益普及的今天&#xff0c;降低交易成本对商家而言至关重要。本文将引导您轻松开通微信支付0.2%的超低费率。 首先&#xff0c;让我们深入了解微信支付为不同商户类别提供的相关资质要求、费率标准以及资金结算的时间周期https://kf.qq.com/faq/220228IJb2UV220228u…

JWT知识

JWT概念 JWT组成 Java实现JWT Header String getHeader() {String header "{\"alg\":\"HS256\",\"typ\":\"JWT\"}";String encodeBase64URLSafeString Base64.encodeBase64URLSafeString(header.getBytes(StandardCharset…

8. 安全认证

8. 安全认证 文章目录 8. 安全认证8.1 访问控制概述8.2 认证管理8.3 授权管理8.4 准入控制 8.1 访问控制概述 Kubernetes作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作。…

DevEco Studio 项目鸿蒙(HarmonyOS)多语言

DevEco Studio 项目鸿蒙&#xff08;HarmonyOS&#xff09;多语言 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、多语言 新版本IDE可以创建多语言的文件夹&#xff0c;在entry->src->main->resources下&#xff0c;修…

C#深拷贝效率对比

对于浅拷贝和深拷贝&#xff0c;前面的文章已经说明了。 C#浅拷贝和深拷贝数据-CSDN博客 本篇说一下&#xff0c;深拷贝的效率问题&#xff0c;效率一直是程序追求的&#xff0c;效率越高肯定越好&#xff0c;有时候功能是实现了&#xff0c;但是运行以及处理数据的效率非常低…

C/C++ STL提供的关联式容器之set

set&#xff08;集合&#xff09;顾名思义&#xff0c;就是数学上的集合 —— 每个元素最多只出现一次&#xff0c;并且 set 中的元素已经从小到大排好序。 特点 1. 使用红黑树实现&#xff0c;其内部元素依据其值自动排序&#xff0c;每个元素值只能出现一次&#xff0c;…