log4j2笔记 #01# Architecture

Architecture

Main Components

Log4j使用下图所示的类。html

使用Log4j 2 API的应用程序将从LogManager请求具备特定名称的Logger。LogManager将定位适当的LoggerContext,而后从中获取Logger。若是必须建立Logger,它将与LoggerConfig相关联,LoggerConfig包含 a)与Logger相同的名字,b)父包的名字,或 c) root LoggerConfig。LoggerConfig对象是从配置中的Logger声明建立的。LoggerConfig与实际交付LogEvents的Appenders相关联。apache

Logger Hierarchy

与普通System.out.println相比,任何日志API的第一个也是最重要的优势是:可以禁用某些日志语句,同时容许其余日志语句不受阻碍地打印。这个功能假定日志空间,也就是全部可能日志语句的空间,是根据开发人员选择的一些标准进行分类的。api

在Log4j 1.x 里,Logger层次结构是经过Logger之间的关系来维护的。在Log4j 2中,这种关系再也不存在。相反,层次结构是在LoggerConfig对象之间的关系中维护的。app

Logger和LoggerConfig是命名实体。日志记录器名称区分大小写,它们遵循分层命名规则spa

LoggerContext

LoggerContext充当日志系统的锚点。可是,根据具体状况,应用程序中可能有多个活动的LoggerContexts 。有关LoggerContext的更多细节见日志分隔部分。日志

Configuration

每一个LoggerContext都有一个活动的Configuration。Configuration包含全部Appenders、上下文范围的Filters、LoggerConfigs,并包含对StrSubstitutor的引用。在从新配置期间,将存在两个配置对象。一旦全部Logger被重定向到新的Configuration,旧的Configuration将被中止并丢弃。htm

Logger

如前所述,Logger是经过调用LogManager.getLogger建立的。Logger自己不执行任何直接操做。它只有一个名称,并与LoggerConfig关联。它扩展了AbstractLogger并实现了所需的方法。当配置被修改时,记录器可能与不一样的LoggerConfig关联,从而致使它们的行为被修改。 对象

Retrieving Loggers

因为以Logger所属类的名称命名Logger是一种很是常见的习惯用法,所以提供了方便的方法LogManager.getLogger()来自动使用调用类的彻底限定类名做为Logger名称blog

LoggerConfig

LoggerConfig对象是在日志配置中声明Logger时建立的。LoggerConfig包含一组Filters,LogEvent在传递给任何Appenders以前,必须经过这些Filters。它包含用于处理事件的Appenders的引用。继承

Log Levels

Log4j 1.xLogback都有级别继承的概念。在Log4j 2中,Logger和LoggerConfigs是两个不一样的对象,所以这个概念的实现是不一样的。每一个Logger引用适当的LoggerConfig,而LoggerConfig又能够引用它的父类,从而达到相同的效果。(PS. 言下之意,概念没有变,只不过实现方式有点不同罢了)

与Logback不一样的是,在ERROR和OFF中间添加了FATAL级别。

Filter

除了根据日志级别自动过滤,如前一节所述,Log4j提供Filters,能够应用在控制传递给任何LoggerConfig以前,控制传递给LoggerConfig后但在调用任何Appenders以前,控制传递给LoggerConfig后但在调用一个特定的Appender以前,以及每个Appender之中。以一种与防火墙过滤器很是类似的方式,每一个过滤器能够返回三个结果之一,Accept, Deny或者Neutral。

虽然事件可能被Filter接受,但事件仍然可能没有被记录。当事件被pre-LoggerConfig Filter接受,但随后被LoggerConfig Filter拒绝或被全部appender拒绝时,就会发生这种状况。

Appender

appender可加性的内容仍然能够参考Logback的。

Layout

相似Logback

StrSubstitutor and StrLookup

StrSubstitutor类和StrLookup接口是从Apache Commons Lang中借来的,而后进行了修改,以支持评估LogEvents。此外,Interpolator类是从Apache Commons Configuration中借来的,以容许StrSubstitutor计算来自多个StrLookups的变量。它也被修改以支持评估LogEvents。它们一块儿提供了一种机制,容许配置引用来自系统属性、配置文件、ThreadContext映射、LogEvent中的StructuredData的变量。变量能够在处理配置时解析,也能够在处理每一个事件时解析(若是组件可以处理的话)。有关更多信息,请参见Lookups 。

相关文章
相关标签/搜索