log4j2中文手册文档格式.docx

上传人:b****6 文档编号:16385826 上传时间:2022-11-23 格式:DOCX 页数:58 大小:266.27KB
下载 相关 举报
log4j2中文手册文档格式.docx_第1页
第1页 / 共58页
log4j2中文手册文档格式.docx_第2页
第2页 / 共58页
log4j2中文手册文档格式.docx_第3页
第3页 / 共58页
log4j2中文手册文档格式.docx_第4页
第4页 / 共58页
log4j2中文手册文档格式.docx_第5页
第5页 / 共58页
点击查看更多>>
下载资源
资源描述

log4j2中文手册文档格式.docx

《log4j2中文手册文档格式.docx》由会员分享,可在线阅读,更多相关《log4j2中文手册文档格式.docx(58页珍藏版)》请在冰豆网上搜索。

log4j2中文手册文档格式.docx

Log4j1有已知的死锁问题,Logback也需要使用synchronization来保持在相当高的锁级别。

(13)Apache开源

二.Log4j2架构

1.Log4j2类图

应用程序调用Log4jAPI时需要向LogManager传入一个特定的名称来获取一个Logger实例。

LogManager会定位一个合适的LoggerContext然后从中获取Logger。

如果Logger必须新建,那么与之关联的LoggerConfig遵守如下规则:

(1)与Logger名称完全相同。

(2)父Logger的名称。

(3)RootLoggerConfig。

LoggerConfig对象是根据configuration配置中的Logger声明创建的。

LoggerConfig又与处理LogEvents的LoggerConfig关联。

2.日志层次

loggingAPI相比于纯粹的System.out.println最重要的不同是:

loggingAPI可以禁用一些log语句输出的同时允许其他一些语句块输出。

这种能力建立在开发者按照一定规则将日志分类的基础上。

Log4j1.x的层次关系是通过Loggers之间的关系保持的。

而Log4j2.x是通过LoggerConfig对象来维持这种层次关系的。

Loggers与LoggerConfigs都是带名称的实体。

Logger名称是大小写敏感的,并且符合如下命名层级规则:

一个LoggerConfig的名字是另外一个LoggerConfig名字加上.和一些后缀字符。

那么这个LoggerConfig是另外的LoggerConfig的子类。

类似于java的package路径。

例如:

一个名称为"

com.foo"

的LoggerConfig是一个名称为"

com.foo.Bar"

的LoggerConfig的父类。

类似的,“java”是"

java.util"

的父类和"

java.util.Vector"

的祖先类。

开发人员对这样的命名方案应该很熟悉。

RootLoggerConfig居于LoggerConfig分层的顶层。

RootLoggerConfig总是存在于每个LoggerConfig的层次中。

任何一个与root 

LoggerConfig相关联的Logger可以通过如下方式获得:

Loggerlogger=LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

也可以用如下简便方式:

Loggerlogger=LogManager.getRootLogger();

其他的Logger可以使用LogManager.getLogger 

的静态方法根据传入的名称获得。

3.LoggerContext

LoggerContext作为日志系统的锚点(用于根据日志名称定位日志输出信息的Logger),在不同的环境中,一个应用系统中可能存在多个有效的LoggerContexts 

4.Configuration

每个LoggerContext 

有一个有效的Configuration 

Configuration 

包括所有的Appenders,上下文过滤器,LoggerConfigs 

与包含StrSubstitutor的引用信息。

在配置重载期间,两个Configuration 

共存,一旦所有的Logger重定向到新的Configuration 

,旧的Configuration 

将停用和丢弃。

5.Logger

Loggers 

是调用LogManager.getLogger静态方法创建的。

Logger本身不直接执行动作。

它只有一个名称,并于一个LoggerConfig相关联。

它继承自 

AbstractLogger,当configuration 

被修改时,Loggers 

将关联修改后的LoggerConfig,从而改变这个Loggers 

的行为。

获取Loggers:

使用相同的名称调用LogManager.getLogger方法,总是返回完全相同的Logger 

对象。

例如:

Loggerx=LogManager.getLogger("

wombat"

);

Loggery=LogManager.getLogger("

X和y指向完全相同的Logger对象。

Log4j配置环境通常是在应用程序初始化时完成的。

最好的方式是读取配置文件。

Log4j很容易通过类名来命名,这可以在每个类初始化的时候完成Logger 

的初始化,Logger的名称就等于类的完整路径,这是一个定义Logger的简单有效的方式。

当为日志文件输出具有Logger名称的日志时,这种命名策略可以很容易看出一个日志消息的来源。

当然这只是一种比较常见的日志命名方式,log4j并没有对此进行限制,开发人员可以按照需求进行命名。

因为使用类名命名Logger是一个习惯用法。

一个便利的方法是使用LogManager.getLogger()来获取类的全路径名称的Logger。

目前为止,使用类名来作为Logger的名称是最好的方式。

6.LoggerConfig

当Logger对象在loggingconfiguration中被定义时,LoggerConfig对象同时被创建。

LoggerConfig 

包含一组Filters 

来过滤传递到Appenders的LogEvent 

LoggerConfig使用一组Appenders 

用来处理这些事件。

LogLevels

LoggerConfigs 

被分配一个日志级别,包括:

 

TRACE,DEBUG,INFO,WARN,ERROR,FATAL。

Log4j 

2也支持自定义日志级别,另一种获得更多日志粒度的方式是使用Markers。

Log4j1与logback都有日志级别继承的概念。

在Log4j2中,因为 

Loggers和LoggerConfigs是2个不同的对象,所以这个概念的实现有所不同。

但是因为每个Loggers都关联一个相应的LoggerConfig,所以最终效果是相同的。

如果一个rootLoggerConfig没有配置日志级别,将分配一个默认级别。

LoggerName

AssignedLoggerConfig

LoggerConfigLevel

LoggerLevel

root

DEBUG

X

X.Y

X.Y.Z

Example1

在Example1中,仅配置了rootlogger与其日志级别,所有的Loggers都会引用 

rootLoggerConfig,并使用其日志级别。

Level

ERROR

INFO

WARN

Example2

在Example2中,每个Logger都有其对应的LoggerConfig 

和相应的日志级别。

Example3

在Example3中,Loggerroot, 

和X.Y.Z都有与名称完全匹配的LoggerConfig 

配置,而LoggerX.Y没有与其命名匹配的LoggerConfig 

,所以使用拥有最长匹配度的 

X的LoggerConfig 

level

Example4

Example4中,root 

与X各自有一个与名称完全匹配的LoggerConfig 

,而X.Y 

与X.Y.Z没有与名称完全匹配的LoggerConfig 

,所以使用与其名称有最长匹配度的X的LoggerConfig 

X.YZ

Example5

Example5中root.X,与X.Y有与名字完全匹配的LoggerConfig 

,而 

X.YZ将与X相匹配而不是X.Y,因为路径匹配时按照.进行分割和匹配的。

Example6

Example6中,X.Y与X.Y.Z都没有配置相应的日志级别,所以他们从LoggerX中继承了日志级别。

 

下面的表格展示了logEvent(垂直方向)与LoggerConfig(水平方向)的过滤方式:

EventLevel

TRACE

FATAL

OFF

ALL

YES

NO

7.Filter

Log4j2提供了Filters,可以应用于控制权传递到LoggerConfig之前,控制权传递到LoggerConfig之后但是在调用Appenders之前,控制权在传递到LoggerConfig之后,但是在调用一个指定的Appender之前。

类似于防火墙的处理方式,每个Filters可以返回三个结果的其中之一。

Accept, 

Deny 

Neutral。

Accept意味着不会再调用其他Filters 

了,LogEvent将被执行。

Deny意味着立即忽略这个LogEvent,并将这个LogEvent的控制权交还给它调用者。

Neutral 

指LogEvent将传递给其他Filters 

,如果没有别的Filters 

了,那么这个LogEvent将被执行。

尽管一个LogEvent可能被一个Filter接收,但是这个LogEvent仍然没有被日志记录下来,发生这种情况的场景可能是LogEvent被pre-LoggerConfigFilter接收了,但是却被LoggerConfig拒绝了,或者被所有的Appenders拒绝了。

8.Appender

由logger的不同来决定一个logging 

request是被禁用还是启用只是log4j2的情景之一。

log4j2还允许将logging 

request中log信息打印到不同的目的地中。

在log4j2的世界里,不同的输出位置被称为Appender。

目前,Appender可以是console、文件、远程socket服务器、Apache 

Flume、JMS以及远程 

UNIX 

系统日志守护进程,数据库。

一个Logger可以绑定多个不同的Appender。

可以通过调用当前Configuration的addLoggerAppender 

方法为Logger增加一个Appender 

如果不存在一个与Logger名称相对应的LoggerConfig,那么相应的LoggerConfig将被创建,并且新增加的Appender将被添加到此新建的LoggerConfig中。

然后,所有的Loggers将会被通知更新自己的LoggerConfig引用(PS:

一个Logger的LoggerConfig引用是根据名称的匹配长度来决定的,当新的LoggerConfig被创建后,会引发一轮配对洗牌)。

某个logger 

中被启用的 

loggingrequest 

将被转发到该LoggerLoggerConfig 

相关联的的所有Appenders上,并且还会被转发到LoggerConfig的父级的Appenders上。

换句话说,Appenders将从LoggerConfig的层次结构中获得继承。

例如,对LoggerConfig 

B来说,它的父级为A,A的父级为root。

如果在root中定义了一个Appender为console,那么所有启用了的logging 

request都会在console中打印出来。

另外,如果LoggerConfig 

A定义了一个文件作为Appender,那么使用LoggerConfig 

A和LoggerConfig 

B的logger 

的logging 

request都会在该文件中打印,并且同时在console中打印。

如果想避免这种遗传效应的话,可以在configuration文件中做如下设置:

additivity="

false"

这样,就可以关闭Appender的遗传效应了。

具体解释如下:

AppenderAdditivity

TheoutputofalogstatementofLogger 

willgotoalltheAppendersintheLoggerConfigassociatedwith 

andtheancestorsofthatLoggerConfig.Thisisthemeaningoftheterm"

appenderadditivity"

.

However,ifanancestoroftheLoggerConfigassociatedwithLogger 

L,say 

P,hastheadditivityflagsetto 

false,then 

L'

soutputwillbedirectedtoalltheappendersin 

sLoggerConfigandit'

sancestorsuptoandincluding 

butnottheAppendersinanyoftheancestorsof 

P.

Loggershavetheiradditivityflagsetto 

true 

bydefault.

上面例子的详细表格解释如下:

Logger

Name

Added

Appenders

Additivity

Flag

OutputTargets

Comment

A1

notapplicable

Therootloggerhasnoparentsoadditivitydoesnotapplytoit.

x

A-x1,A-x2

true

A1,A-x1,A-x2

Appendersof"

x"

androot.

x.y

none

androot.ItwouldnotbetypicaltoconfigureaLoggerwithnoAppenders.

x.y.z

A-xyz1

A1,A-x1,A-x2,A-xyz1

Appendersin"

x.y.z"

"

security

A-sec

false

Noappenderaccumulationsincetheadditivityflagissetto 

false.

security.access

Onlyappendersof"

security"

becausetheadditivityflagin"

issetto 

9.Layout

通常,用户不止希望能定义log输出的位置,还希望可以定义输出的格式。

这就可以通过将Appender与一个layout相关联来实现。

Log4j中的一个标准定义PatternLayout,就允许用户使用一种类似C语言printf函数的打印格式,

如"

%r 

[%t] 

%-5p 

%c 

%m%n"

格式在真实环境下会打印类似如下的信息:

176 

[main] 

INFO 

org.foo.Bar 

Located 

nearest 

gas 

station.

第一个字段是启动的毫秒数,第二个字段是日志请求的线程号,第三个字段是日志请求级别,第四个是与日志请求相关联的日志名称,在“-”之后的内容就是日志内容。

Log4j有各种不同的Layouts,例如:

JSON,XML,HTML,和Syslog(includingthenewRFC5424version). 

其他一些appenders例如databaseconnectors会使用指定的字段替代特定的文本布局。

同样重要的是,要使得log4j的日志消息内容符合用户指定的标准。

,例如:

在你的工程中,你需要一个Oranges类型的日志对象,你就可以创建一个OrangeMessage,可以接受Orange实例并且传递到log4j,Orange对象就会被格式化为一个适当的字节数组。

10.StrSubstitutorandStrLookup

StrSubstitutor 

类与StrLookup接口是来自ApacheCommonsLang,并且被修改为支持LogEvents的运算。

此外 

来自ApacheCommonsConfiguration的 

Interpolator类允许StrSubstitutor运算来着多个StrLookups的变量,它也被修改支持LogEvents的运算。

Log4j2提供了一种机制,可以使得configuration引用来自SystemProperties,theconfigurationfile,theThreadContextMap,StructuredData中的变量。

当configuration被加载或者每个LogEvent运行时,这个变量将被解析。

如果这个日志组件可以处理这个变量。

三.Log4j2API

Log4j2API提供了应用程序使用的接口,也提供了创建一个日志实现所需的适配器组件,

Log4j2解耦了API及其实现之间的关系。

这样做的目的是不允许有多个实现。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1