如何做好网站关键词优化,微信网站怎么做,家具设计师常去的网站,网站建设的基本话术Log4j 2、Logpack、SLF4j日志框架介绍 Log4j 2、Logpack、SLF4j日志框架#xff0c;及其区别1.1 Log4j 21.1.1 日志级别1.1.2 日志输出目标位置1.1.3 日志刷新机制1.1.4 结构化打印日志1.1.5 异步打印日志1.1.6 在Cloud云环境汇集日志信息 1.2 LogPack1.3 SLF4j1.4 区别 Log4j… Log4j 2、Logpack、SLF4j日志框架介绍 Log4j 2、Logpack、SLF4j日志框架及其区别1.1 Log4j 21.1.1 日志级别1.1.2 日志输出目标位置1.1.3 日志刷新机制1.1.4 结构化打印日志1.1.5 异步打印日志1.1.6 在Cloud云环境汇集日志信息 1.2 LogPack1.3 SLF4j1.4 区别 Log4j 2、Logpack、SLF4j日志框架及其区别
1.1 Log4j 2 注意二者在包名上的区别考虑到目前使用的大多是Log4j 2Log4j的使用就不单开一节做介绍了。 Log4j : org.apache.log4j.xxx Log4j 2 : org.apache.logging.log4j.xxx dependencies!--log4j 2日志框架--dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-api/artifactIdversion2.20.0/version/dependencydependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-core/artifactIdversion2.20.0/version/dependency/dependencies1.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 applicationsuch 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 version1.0 encodingUTF-8?
Configuration statusINFOAppendersFile namefile fileName./logs/app.logPatternLayout pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n //File/AppendersLoggersRoot levelinfoAppenderRef reffile //Root/Loggers
/Configuration1.1.3 日志刷新机制
同时为了防止文件无限度的增长需要让log4j开辟一个新文件去存储这可以用RollingFile来实现即文件滚动。还是在上一段xml的基础上修改了一点内容。那么可以看到日志会输出至.gz后缀的压缩文件一旦文件到了1KB就会新建另一个.gz后缀的压缩文件这里选1KB是为了方便运行观察效果实际中肯定是选百MB或GB级别的。
?xml version1.0 encodingUTF-8?
Configuration statusINFOAppendersRollingFile namerolling fileNamelogs/app.logfilePatternlogs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gzPatternLayout pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n /PoliciesTimeBasedTriggeringPolicy /SizeBasedTriggeringPolicy size250 MB //Policies/RollingFile/AppendersLoggersRoot levelinfoAppenderRef refrolling //Root/Loggers/Configuration除了根据大小刷新日志还有定时刷新日志的功能更多功能具体请看参考文章[1]不过这篇文章在cron表达式与OnStartupTriggeringPolicy处有错误不能全部都信。
1.1.4 结构化打印日志
除了PatternLayout规定的格式我们还可以用JSON、XML格式来打印日志可以用JsonLayout来打印JSON格式的日志首先要添加jar包依赖
!--pom.xml--dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.15.0/version/dependencydependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-core/artifactIdversion2.15.0/version/dependency!--log4j2.xml--
?xml version1.0 encodingUTF-8?
Configuration statusINFOAppendersConsole nameconsole targetSYSTEM_OUTJsonLayout //Console/AppendersLoggersRoot leveltraceAppenderRef refconsole //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.{buyerNamejack, destinationxxxxxxxxxx, orderNumber1234567890},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 接口-- dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion2.0.9/version/dependencydependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-slf4j2-impl/artifactIdversion2.22.0/version/dependencydependency !--使用slf4j框架进行AsyncLogging异步日志打印时若出现java.lang.NoClassDefFoundError: com/lmax/disruptor/EventHandler时需要引入--groupIdcom.lmax/groupIdartifactIddisruptor/artifactIdversion3.4.4/version/dependency/dependencies参考视频或文章链接SLF4J Manaul - Offical WebsiteIntroduction to SLF4JLog4j 2 SLF4J Binding - Apache
1.4 区别
首先Log4j 2与SLF4j并非同一事物虽然在搜索Log4j 2时时常会搜索出混杂了SLF4j与Log4j 2的内容。
参考视频或文章链接Java Logging Frameworks Comparison: SLF4j vs Log4j vs Logback vs Log4j2 [Differences]《最通俗易懂的 JAVA slf4j,log4j,log4j2,logback 关系与区别以及完整集成案例》