log4j2中文手册簿.docx

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

log4j2中文手册簿.docx

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

log4j2中文手册簿.docx

log4j2中文手册簿

Log4j2使用手册

一.Log4j2介绍

Log4j1.x被广泛应用于应用程序,但是近年发展明显放缓,因为要维持较老java版本的使用,使得log4j1.x的发展更困难。

而作为其代替品,slf4j/logback做出了许多必要改进,为什么还需要log4j2?

主要有以下几个原因:

(1)Log4j2被设计用作审计日志框架,log4j和logback在重载配置时,都会丢失日志时间,而log4j2不会。

Logback中appenders中的异常对于应用来说是不可见的,log4j2可以配置异常向应用渗透。

(2)Log4j2包含基于 LMAXDisruptorlibrary的下一代无锁AsynchronousLoggers,在多线程环境下,AsynchronousLoggers相比slf4j/logback提高了10倍以上的吞吐量,并且有着更低的延时。

(3)Log4j2的插件机制,使得在不需要修改框架的情况下,通过添加 Appenders, Filters, Layouts, Lookups轻松扩展框架。

(4)简单的插件配置,无需指定具体类名即可在configuration中配置插件。

(5)支持自定义日志级别,可以在代码或者configuration中自定义日志级别。

(6)支持lambda表达式,java8的应用可以在请求日志级别启用时使用lambda表达式懒构建一个日志消息,不需要显示的日志级别检查,使得代码更简洁。

(7)支持消息对象,消息允许支持有趣和复杂的结构,传递到日志记录系统,并且可以高效的操作。

用户可以自由创建消息类型和编写Layouts,FiltersandLookups来操作这些消息。

(8)Log4j1在Appenders上支持Filters 。

logback增加了TurboFilters ,允许在日志事件在处理前进行过滤。

Log4j2可以配置Filters在Logger后者Appender前运行。

(9)许多Logback的Appenders不接受Layout,并且只能按照固定格式发送日志数据。

大部分log4j2接收Layout配置,允许日志数据按照任何所需格式传输。

(10)Log4j1与logback的Layouts是返回一个String类型,这可能导致一些编码问题。

Log4j2使用了简单的方式:

返回一个byte数组。

这以为着Layouts可以用在几乎任何appenders,而不仅仅是写入OutputStream。

(11)Syslogappender支持TCP与UDP,以及BSDsyslog和RFC5424格式。

(12)Log4j2得益于java5的并发支持,将锁的可能降到最低水平。

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("wombat");

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

root

DEBUG

DEBUG

X

root

DEBUG

DEBUG

X.Y

root

DEBUG

DEBUG

X.Y.Z

root

Example1

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

 

LoggerName

AssignedLoggerConfig

LoggerConfigLevel

Level

root

root

DEBUG

DEBUG

X

X

ERROR

ERROR

X.Y

X.Y

INFO

INFO

X.Y.Z

X.Y.Z

WARN

WARN

Example2

在Example2中,每个Logger都有其对应的LoggerConfig 和相应的日志级别。

LoggerName

AssignedLoggerConfig

LoggerConfigLevel

Level

root

root

DEBUG

DEBUG

X

X

ERROR

ERROR

X.Y

X

ERROR

ERROR

X.Y.Z

X.Y.Z

WARN

WARN

Example3

在Example3中,Loggerroot, X 和X.Y.Z都有与名称完全匹配的LoggerConfig 配置,而LoggerX.Y没有与其命名匹配的LoggerConfig ,所以使用拥有最长匹配度的 X的LoggerConfig 。

LoggerName

AssignedLoggerConfig

LoggerConfigLevel

level

root

root

DEBUG

DEBUG

X

X

ERROR

ERROR

X.Y

X

ERROR

ERROR

X.Y.Z

X

ERROR

ERROR

Example4

Example4中,root 与X各自有一个与名称完全匹配的LoggerConfig ,而X.Y 与X.Y.Z没有与名称完全匹配的LoggerConfig ,所以使用与其名称有最长匹配度的X的LoggerConfig 。

LoggerName

AssignedLoggerConfig

LoggerConfigLevel

level

root

root

DEBUG

DEBUG

X

X

ERROR

ERROR

X.Y

X.Y

INFO

INFO

X.YZ

X

ERROR

ERROR

Example5

Example5中root.X,与X.Y有与名字完全匹配的LoggerConfig ,而 X.YZ将与X相匹配而不是X.Y,因为路径匹配时按照.进行分割和匹配的。

LoggerName

AssignedLoggerConfig

LoggerConfigLevel

Level

root

root

DEBUG

DEBUG

X

X

ERROR

ERROR

X.Y

X.Y

ERROR

X.Y.Z

X.Y

ERROR

Example6

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

 

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

EventLevel

LoggerConfigLevel

 

TRACE

DEBUG

INFO

WARN

ERROR

FATAL

OFF

ALL

YES

YES

YES

YES

YES

YES

NO

TRACE

YES

NO

NO

NO

NO

NO

NO

DEBUG

YES

YES

NO

NO

NO

NO

NO

INFO

YES

YES

YES

NO

NO

NO

NO

WARN

YES

YES

YES

YES

NO

NO

NO

ERROR

YES

YES

YES

YES

YES

NO

NO

FATAL

YES

YES

YES

YES

YES

YES

NO

OFF

NO

NO

NO

NO

NO

NO

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 L andtheancestorsofthatLoggerConfig.Thisisthemeaningoftheterm"appenderadditivity".

However,ifanancestoroftheLoggerConfigassociatedwithLogger L,say P,hastheadditivityflagsetto false,then L'soutputwillbedirectedtoalltheappendersin L'sLoggerConfigandit'sancestorsuptoandincluding P butnottheAppendersinanyoftheancestorsof P.

Loggershavetheiradditivityflagsetto true bydefault.

 

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

Logger

Name

Added

Appenders

Additivity

Flag

OutputTargets

Comment

root

A1

notapplicable

A1

Therootloggerhasnoparentsoadditivitydoesnotapplytoit.

x

A-x1,A-x2

true

A1,A-x1,A-x2

Appendersof"x"androot.

x.y

none

true

A1,A-x1,A-x2

Appendersof"x"androot.ItwouldnotbetypicaltoconfigureaLoggerwithnoAppenders.

x.y.z

A-xyz1

true

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

Appendersin"x.y.z","x"androot.

security

A-sec

false

A-sec

Noappenderaccumulationsincetheadditivityflagissetto false.

security.access

none

true

A-sec

Onlyappendersof"security"becausetheadditivityflagin"security"issetto false.

 

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