log4j2中文手册簿Word文件下载.docx
- 文档编号:18846257
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:60
- 大小:262.40KB
log4j2中文手册簿Word文件下载.docx
《log4j2中文手册簿Word文件下载.docx》由会员分享,可在线阅读,更多相关《log4j2中文手册簿Word文件下载.docx(60页珍藏版)》请在冰豆网上搜索。
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
和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
L
willgotoalltheAppendersintheLoggerConfigassociatedwith
andtheancestorsofthatLoggerConfig.Thisisthemeaningoftheterm"
appenderadditivity"
.
However,ifanancestoroftheLoggerConfigassociatedwithLogger
L,say
P,hastheadditivityflagsetto
false,then
L'
soutputwillbedirectedtoalltheappendersin
sLoggerConfigandit'
sancestorsuptoandincluding
P
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及其实现之间的关系
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- log4j2 中文 手册