您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 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的层次中。任何一个与rootLoggerConfig相关联的Logger可以通过如下方式获得:Loggerlogger=LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);也可以用如下简便方式:Loggerlogger=LogManager.getRootLogger();其他的Logger可以使用LogManager.getLogger的静态方法根据传入的名称获得。3.LoggerContextLoggerContext作为日志系统的锚点(用于根据日志名称定位日志输出信息的Logger),在不同的环境中,一个应用系统中可能存在多个有效的LoggerContexts,4.Configuration每个LoggerContext有一个有效的Configuration。Configuration包括所有的Appenders,上下文过滤器,LoggerConfigs与包含StrSubstitutor的引用信息。在配置重载期间,两个Configuration共存,一旦所有的Logger重定向到新的Configuration,旧的Configuration将停用和丢弃。5.LoggerLoggers是调用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用来处理这些事件。LogLevelsLoggerConfigs被分配一个日志级别,包括:TRACE,DEBUG,INFO,WARN,ERROR,FATAL。Log4j2也支持自定义日志级别,另一种获得更多日志粒度的方式是使用Markers。Log4j1与logback都有日志级别继承的概念。在Log4j2中,因为Loggers和LoggerConfigs是2个不同的对象,所以这个概念的实现有所不同。但是因为每个Loggers都关联一个相应的LoggerConfig,所以最终效果是相同的。如果一个rootLoggerConfig没有配置日志级别,将分配一个默认级别。LoggerNameAssignedLoggerConfigLoggerConfigLevelLoggerLevelrootrootDEBUGDEBUGXrootDEBUGDEBUGX.YrootDEBUGDEBUGX.Y.ZrootExample1在Example1中,仅配置了rootlogger与其日志级别,所有的Loggers都会引用rootLoggerConfig,并使用其日志级别。LoggerNameAssignedLoggerConfigLoggerConfigLevelLevelrootrootDEBUGDEBUGXXERRORERRORX.YX.YINFOINFOX.Y.ZX.Y.ZWARNWARNExample2在Example2中,每个Logger都有其对应的LoggerConfig和相应的日志级别。LoggerNameAssignedLoggerConfigLoggerConfigLevelLevelrootrootDEBUGDEBUGXXERRORERRORX.YXERRORERRORX.Y.ZX.Y.ZWARNWARNExample3在Example3中,Loggerroot,X和X.Y.Z都有与名称完全匹配的LoggerConfig配置,而LoggerX.Y没有与其命名匹配的LoggerConfig,所以使用拥有最长匹配度的X的LoggerConfig。LoggerNameAssignedLoggerConfigLoggerConfigLevellevelrootrootDEBUGDEBUGXXERRORERRORX.YXERRORERRORX.Y.ZXERRORERRORExample4Example4中,root与X各自有一个与名称完全匹配的LoggerConfig,而X.Y与X.Y.Z没有与名称完全匹配的LoggerConfig,所以使用与其名称有最长匹配度的X的LoggerConfig。LoggerNameAssignedLoggerConfigLoggerConfigLevellevelrootrootDEBUGDEBUGXXERRORERRORX.YX.YINFOINFOX.YZXERRORERRORExample5Example5中root.X,与X.Y有与名字完全匹配的LoggerConfig,而X.YZ将与X相匹配而不是X.Y,因为路径匹配时按照.进行分割和匹配的。LoggerNameAssignedLoggerConfigLoggerConfigLevelLevelrootrootDEBUGDEBUGXXERRORERRORX.YX.YERRORX.Y.ZX.YERRORExample6Example6中,X.Y与X.Y.Z都没有配置相应的日志级别,所以他们从LoggerX中继承了日志级别。下面的表格展示了logEvent(垂直方向)与LoggerConfig(水平方向)的过滤方式:EventLevelLoggerConfigLevelTRACEDEBUGINFOWARNERRORFATALOFFALLYESYESYESYESYESYESNOTRACEYESNONONONONONODEBUGYESYESNONONONONOINFOYESYESYESNONONONOWARNYESYESYESYESNONONOERRORYESYESYESY
本文标题:log4j2中文手册
链接地址:https://www.777doc.com/doc-4613085 .html