log4j2的入门到了解

关于log4j2概念简介

log4j的官网地址

日志框架

引用自浅谈Log4j2日志框架及使用

  • 日志接口(slf4j)
       slf4j即简单日志门面(Simple Logging Facade for Java)是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback),其本省也有一个简单的实现
       Jakarta Commons-logging(JCL)是apache最早提供的日志的门面接口。提供简单的日志实现以及日志解耦功能。(现在名称是 Apache Commons-logging),其实现默认是jdk自带的日志组件Jdk14Logger
  • 日志实现(log4j、logback、log4j2)
    1. log4j是apache实现的一个开源日志组件
    2. logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现
    3. log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),多线程下,异步日志的吞吐量是og4j 1.x的18倍,性能更高,并解决了一些死锁的bug,而且配置更加简单灵活。(采用自动模块,不仅仅只是实现)

为什么需要日志接口,直接使用具体的实现不就行了吗?

 接口用于定制规范,可以有多个实现,使用时是面向接口的(导入的包都是slf4j的包而不是具体某个日志框架中的包),即直接和接口交互,不直接使用实现,所以可以任意的更换实现而不用更改代码中的日志相关代码。
例:项目中代码调用slf4j接口,具体的实现是logback,我们可以不改代码替换成log4j或log4j2的实现

log4j到log4j2的大变化(重要)

上面已经介绍过主要的日志框架,log4j是一个jar包,接口和实现都是在一起的,log4j2的接口和实现是分开的,这是log4j2的运行时依赖的地址,和slf4j的使用形式差不多,如下图

在这里插入图片描述

  1. log4j-api和log4j-core的jar包使用相当于原先使用一个log4j的jar包,
  2. log4j-api 除了和其原生实现log4j-core 使用不需要其他的jar包外,其他的日志框架log4j都提提供了桥接的jar包,

日志api决定应用中代码的调用方式(比如api是slf4j,那么在代码中就可以使用占位符赋值的方式,{},而不用关注底层实现)

日志api/框架 桥接jar包(也可以称为适配器 被桥接对象 描述
log4j-api log4j-core 直接实现,不用桥接
log4j-1.2-api log4j-api/log4j-core log4j的jar中api的覆写,将项目中对log4j的调用转移到log4j2,(需要删除原有log4j的jar包)
commons-logging log4j-jcl log4j-api/log4j-core commons-logging 使用log4j2作为实现
slf4j-api log4j-slf4j-impl log4j-api/log4j-core 桥接包可以理解为log4j2作为slf4j的实现
Java Util Logging log4j-jul log4j-api/log4j-core
log4j-api log4j-to-slf4j slf4j-api及其实现 可以通过此链接到logback(logback-classic/logback-core)

还有诸如一些其他jar包(主要是提供支持):
log4j-web :Web模块支持在Servlet容器中自动启用Log4j。
log4j-iostreams: 支持输入到流中
以下省略。。。。。。。。。

4.以上具体的使用版本从官网的查看;
5. 其他桥接的介绍slf4j 与jul、log4j1、log4j2、logback的集成

日志api/框架 桥接jar包(也可以称为适配器 被桥接对象 描述
slf4j-api slf4j-jdk14 jdk-logging
slf4j-api slf4j-log4j12 log4j
slf4j-api logback-classic/logback-core logback-classic可以看做桥接包
slf4j-api slf4j-jcl commons-logging
jdk-logging jul-to-slf4 slf4j-api 是java.util.logging
log4j-over-slf4j slf4j-api log4j转接到上slf4j,去掉原有log4j的jar
jcl-over-slf4j slf4j-api 去掉commons-logging jar包(

在这里插入图片描述

  1. 依赖冲突 :这个桥接jar包之间存在依赖冲突,不能同时使用,否则会形成调用的闭环
  • log4j-to-slf4j和log4j-slf4j-impl
  • jul-to-slf4j和slf4j-jdk14
  • log4j-over-slf4j 和slf4j-log4j12
  • jcl-over-slf4j和slf4j-jcl

log4j的那些版本支持

log4j2的使用原因(变化介绍)

官网介绍
  官网说的是log4j需要兼容非常第的java版本,变得难以维护,所以有log4j2,还有列举了部分使用log4j,而不是使用slfj/logback的原因:

  1. Log4j 1.x和Logback都将在重新配置时丢失事件。Log4j 2不会。
  2. 在多线程场景中,异步记录器的吞吐量比Log4j 1.x和Logback高10倍,延迟低一个数量级。
  3. Log4j 2对于独立应用程序来说是无垃圾的,对于稳态日志记录期间的web应用程序来说是低垃圾的。这减少了垃圾收集器上的压力,并且可以提供更好的响应时间性能。
  4. Log4j 2使用插件系统,通过添加新的附加器、过滤器、布局、查找和模式转换器,无需对Log4j进行任何更改,扩展框架变得非常容易。
  5. 由于插件系统配置更简单。配置中的条目不需要指定类名。
  6. 支持自定义日志级别。自定义日志级别可以在代码或配置中定义。
  7. 支持lambda表达式。只有当请求的日志级别被启用时,运行在Java 8上的客户端代码才能使用lambda表达式来懒洋洋地构造日志消息。不需要显式级别检查,导致代码更干净。
  8. 支持消息对象。消息允许支持有趣和复杂的构造通过日志记录系统传递并被有效地操作。用户可以自由创建自己的消息类型,并编写自定义布局、过滤器和查找来操作它们。
  9. Log4j 1.x支持附录上的Filters。Logback添加了TurboFilters ,允许在事件被记录器处理之前对事件进行过滤。Log4j 2支持过滤器,这些过滤器可以被配置成在事件被记录器处理之前处理事件,就像它们被记录器或附加器处理一样。
  10. 许多日志追加程序不接受Appenders ,只会以固定格式发送数据。大多数Log4j 2附录接受Appenders ,允许数据以任何所需的格式传输
  11. Log4j 1.x和Logback中的布局(Appenders )返回一个字符串。这导致了Logback编码器讨论的问题。Log4j 2采用了更简单的方法,即布局总是返回字节数组。这有一个优点,那就是它们实际上可以用于任何附加程序,而不仅仅是写入输出流的附加程序。
  12. Syslog Appender支持TCP和UDP,也支持BSD syslog和RFC 5424格式
  13. Log4j 2利用Java 5并发支持,并在可能的最低级别执行锁定。Log4j 1.x已经知道死锁问题。其中许多在Logback中是固定的,但是许多Logback类仍然需要相当高水平的同步。
  14. 这是一个Apache软件基金会项目,遵循所有ASF项目使用的社区和支持模式。如果你想贡献或获得提交变更的权利,只需遵循贡献中概述的路径。

log4j的结构体系

官网地址该介绍地址

log4j主要的类的类图

在这里插入图片描述
结合这张图应该更容易理解log4j的配置文件

log4j2的logger的继承规则

这个和log4j中没有太大区别,了解参考以下
log4j从入门到了解
以下是获取根记录器的代码示例(根据名称获取,亦可以用于检索其他记录器)

Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
//或
Logger logger = LogManager.getRootLogger();

类的相关介绍

LoggerContext

记录器上下文充当记录系统的锚点。但是,根据具体情况,应用程序中可能有多个活动的记录器上下文。(应用程序和其他应用共享一个环境)

Configuration

每个记录器上下文都有一个活动配置。该配置包含所有附加器、上下文范围的过滤器、记录器配置,并包含对StrSubstitutor的引用。在重新配置期间,将存在两个配置对象。一旦所有记录器被重定向到新配置,旧配置将被停止并丢弃。

Logger

记录器是通过调用LogManager.getLogger创建的。记录器本身不执行直接操作。它只是有一个名称,并与一个记录器配置相关联。它扩展了抽象记录器并实现了所需的方法。修改配置时,记录器可能会与不同的记录器配置相关联,从而导致其行为被修改

Retrieving Loggers

通过LogManager.getLogger方法通过相同名称获取的是同一记录器对象

LoggerConfig

记录器配置对象是在记录配置中声明记录器时创建的。记录器配置包含一组过滤器,这些过滤器必须允许LogEvent在传递给任何附加器之前通过。它包含对应该用来处理事件的一组附加程序的引用。

Log Levels

 用于识别事件严重性的级别。级别从最具体到最少进行组织:TRACE, DEBUG, INFO, WARN, ERROR, and FATAL.这里提供levelapi地址

1.每个Logger都可以有其单独的LoggerConfig,LoggerConfig也可以继承父记录器,下面是Logger的继承关系的图表示例

以下的实例X\X.Y之类看做类名(同时也是记录器的名称)即可
示例1

Logger Name Assigned LoggerConfig LoggerConfig Level Logger Level
root root DEBUG DEBUG
X root DEBUG DEBUG
X.Y root DEBUG DEBUG
X.Y.Z root DEBUG DEBUG

示例2

Logger Name Assigned LoggerConfig LoggerConfig Level Logger Level
root root DEBUG DEBUG
X X ERROR ERROR
X.Y X.Y INFO INFO
X.Y.Z X.Y.Z WARN WARN

示例3

Logger Name Assigned LoggerConfig LoggerConfig Level Logger Level
root root DEBUG DEBUG
X X ERROR ERROR
X.Y X ERROR ERROR
X.Y.Z X.Y.Z WARN WARN

示例4

Logger Name Assigned LoggerConfig LoggerConfig Level Logger Level
root root DEBUG DEBUG
X X ERROR ERROR
X.Y X ERROR ERROR
X.Y.Z X ERROR ERROR

示例5

Logger Name Assigned LoggerConfig LoggerConfig Level Logger Level
root root DEBUG DEBUG
X X ERROR ERROR
X.Y X.Y INFO INFO
X.YZ X ERROR ERROR

示例6 这里说明的是记录器继承其父类配置,无则往上追溯,一直到根

Logger Name Assigned LoggerConfig LoggerConfig Level Logger Level
root root DEBUG DEBUG
X X ERROR ERROR
X.Y X ERROR
X.Y.Z X ERROR
  1. 下表介绍一下LoggerConfig 配置的过滤级别 ,和其允许通过的日志事件的级别
    在这里插入图片描述

Filter

  1. 自动级别的日志过滤,level中提到
  2. Log4j提供了过滤器(Filter),可以在控制传递给任何记录器配置之前、控制传递给记录器配置之后但在调用任何附加器之前、控制传递给记录器配置之后但在调用特定附加器之前以及在每个附加器上应用。
  3. 过滤器(Filter)可以返回三个结果之一:“接受(Accept)”、“拒绝(Deny )”或“中立(Neutral)”
    a. 接受的响应意味着不应该调用其他过滤器,事件应该继续。
    b.拒绝的响应意味着事件应该立即被忽略,控制应该返回给调用者。
    c.Neutral的响应表示该事件应该传递给其他过滤器。如果没有其他筛选器,则将处理该事件。
  4. 尽管过滤器可以接受某个事件,但该事件仍可能不会被记录。当事件被预记录器配置过滤器接受,但随后被记录器配置过滤器拒绝或被所有附加器拒绝时,这可能会发生。

Appender

。Log4j允许将日志记录请求打印到多个目的地。在log4j中,输出目的地被称为Appender。目前,onsole, files, remote socket servers, Apache Flume, JMS, remote UNIX Syslog daemons, and various database APIs都有对应的Appender,一个记录器可以连接多个附加器代码中通过 addLoggerAppender方法添加。
在这里插入图片描述#### 追加器规则
这个追加器的规则和log4j一样,log4j从入门到了解 的追加器继承规则

LayOut

Layout负责根据用户的意愿格式化LogEvent,和Appender相关联,定义输出格式,

StrSubstitutor and StrLookup

log4j1.X的迁移

前置:

  1. 不得访问Log4j 1.x实现内部的方法和类,例如Appenders、记录器存储库或Category的callAppenders方法。
  2. 还有你必须不是以代码的形式进行配置的(凉凉)
  3. 不能通过调用类DOMConfigurator或属性Configurator来配置.

操作:

  1. 移除log4j1.x的依赖,用log4j-1.2-api代替(应该是覆写了log4j的api部分,使其调用log4j2的api).
  2. 添加log4j-api和其实现log4j-core
  3. 替换配置文件()
  4. 注意依赖的排除,springBoot中需要更改日志配置文件位置classPath 指定,

详细操作连接:

  1. log4j迁移的官网地址
  2. log4j迁移的官网翻译
  3. log4j平稳升级到log4j2(大牛啊)
  4. log4j升级log4j2

log4j2使用占位符的输出形式

写不下去了,哎以后再说吧

猜你喜欢

转载自blog.csdn.net/qq_40182873/article/details/87777709
今日推荐