首页 > 代码库 > Log4j – Configuring Log4j 2 - Apache Log4j 2
Log4j – Configuring Log4j 2 - Apache Log4j 2
ConfigurationInserting log requests into the application code requires a fair amount of planning and effort. Observation shows that approximately 4 percent of code is dedicated to logging. Consequently, even moderately sized applications will have thousands of logging statements embedded within their code. Given their number, it becomes imperative to manage these log statements without the need to modify them manually.(在应用程序代码中插入日志需要大量的计划和努力。观察表明,约百分之4的代码专门用于日志管理。因此,即使是中等大小的应用程序也会有成千上万的日志语句嵌入到它们的代码中。考虑到它们的数量,就必须对这些日志语句进行管理,而不需要手工修改代码。) Configuration of Log4j 2 can be accomplished in 1 of 4 ways:(配置Log4j 2可以使用下面4个方法中的一个来完成:)
This page focuses primarily on configuring Log4j through a configuration file. Information on programmatically configuring Log4j can be found at Extending Log4j 2 and Programmatic Log4j Configuration.(这个章节的焦点是通过配置文件来配置Log4j。通过编程方式来配置Log4j的相关信息可以在Extending Log4j 2 和Programmatic Log4j Configuration 中找到。) Note that unlike Log4j 1.x, the public Log4j 2 API does not expose methods to add, modify or remove appenders and filters or manipulate the configuration in any way.(请注意,与log4j 1.x不同,log4j 2 的Public API没有公开用来添加、修改或删除appender和filters或以任何方式操纵配置的方法) Automatic Configuration(自动配置)Log4j has the ability to automatically configure itself during initialization. When Log4j starts it will locate all the ConfigurationFactory plugins and arrange them in weighted order from highest to lowest. As delivered, Log4j contains four ConfigurationFactory implementations: one for JSON, one for YAML, one for properties, and one for XML.(log4j具有在初始化过程中自动配置自身的能力。当log4j启动就会找到所有的configurationfactory插件和安排他们在从最高到最低的加权进行排序。log4j包含四种ConfigurationFactory 实现:一个JSON,一个YAML,一个properties,和一个XML。)
An example application named MyApp that uses log4j can be used to illustrate how this is done.(一个使用log4j 的例子,可以用来说明Log4j的自动配置是如何完成的。)
MyApp begins by importing log4j related classes. It then defines a static logger variable with the name MyApp which happens to be the fully qualified name of the class.(MyApp通过导入log4j相关的类开始。然后使用了MyApp的全限定类名定义了一个静态的日志记录器。) MyApp uses the Bar class defined in the packagecom.foo.
Log4j will provide a default configuration if it cannot locate a configuration file. The default configuration, provided in the DefaultConfiguration class, will set up:(Log4j在找不到配置文件的时候,提供了一个默认的配置。默认配置由DefaultConfiguration 类提供,会建立:)
Note that by default Log4j assigns the root logger to Level.ERROR.(注意root logger 的默认级别为 Level.ERROR) The output of MyApp would be similar to: 17:13:01.540 [main] ERROR com.foo.Bar - Did it again! 17:13:01.540 [main] ERROR MyApp - Didn‘t do it. As was described previously, Log4j will first attempt to configure itself from configuration files. A configuration equivalent to the default would look like:(正如上面描述的那样,Log4j首先会尝试从配置文件中读取配置。和默认配置等价的配置文件如下:)
Once the file above is placed into the classpath as log4j2.xml you will get results identical to those listed above. Changing the root level to trace will result in results similar to:(一旦上面的文件被命名为log4j2.xml并放在classpath 下,你就会得到和上面的输出结果等价的结果。将 root level 修改为trace会得到类似如下的结果:) 17:13:01.540 [main] TRACE MyApp - Entering application. 17:13:01.540 [main] TRACE com.foo.Bar - entry 17:13:01.540 [main] ERROR com.foo.Bar - Did it again! 17:13:01.540 [main] TRACE com.foo.Bar - exit with (false) 17:13:01.540 [main] ERROR MyApp - Didn‘t do it. 17:13:01.540 [main] TRACE MyApp - Exiting application. Note that status logging is disabled when the default configuration is used.(如果提供了默认的level 则 Configuration 节点中的status 无效) Additivity(附加性)Perhaps it is desired to eliminate all the TRACE output from everything except com.foo.Bar. Simply changing the log level would not accomplish the task. Instead, the solution is to add a new logger definition to the configuration:(也许你想让所有的Trace级别的日志都不输出,除了com.foo.bar。仅仅更改日志级别将无法达到你的目的。相反,解决方法是添加一个新的日志记录器定义:)
With this configuration all log events from com.foo.Bar will be recorded while only error events will be recorded from all other components. (使用这个配置,所有的来自于com.foo.Bar 包下的日志事件都会被记录,然而其它包下的只有error级别的日志事件会被记录。) In the previous example all the events from com.foo.Bar were still written to the Console. This is because the logger for com.foo.Bar did not have any appenders configured while its parent did. In fact, the following configuration(在先前的例子中,所有的来自于 com.foo.Bar 包下的事件仍然会写入到Console 。这是因为 com.foo.Bar 的日志记录器没有配置任何的appenders 然而它的父元素Root却配置了。实际上,它的配置如下: )
would result in 17:13:01.540 [main] TRACE com.foo.Bar - entry 17:13:01.540 [main] TRACE com.foo.Bar - entry 17:13:01.540 [main] ERROR com.foo.Bar - Did it again! 17:13:01.540 [main] TRACE com.foo.Bar - exit (false) 17:13:01.540 [main] TRACE com.foo.Bar - exit (false) 17:13:01.540 [main] ERROR MyApp - Didn‘t do it. Notice that the trace messages from com.foo.Bar appear twice. This is because the appender associated with logger com.foo.Bar is first used, which writes the first instance to the Console. Next, the parent of com.foo.Bar, which in this case is the root logger, is referenced. The event is then passed to its appender, which is also writes to the Console, resulting in the second instance. This is known as additivity. While additivity can be quite a convenient feature (as in the first previous example where no appender reference needed to be configured), in many cases this behavior is considered undesirable and so it is possible to disable it by setting the additivity attribute on the logger to false:(注意,来自于 com.foo.Bar 包下的日志出现了两次。这是因为和com.foo.Bar 日志记录器相关的appender 被第一次使用时,它会将第一个实例写到控制台。接下来又被com.foo.Bar 的父级--root logger 引用。然后当事件被传递给root logger的appender时,它也会将信息写入到控制台,这就导致了两次输出。这就是所谓的附加性。然而additivity 可以是一个相当方便的功能(正如在先前的第一个例子中,他不需要配置 AppenderRef 而是直接使用root logger 的AppenderRef ),在许多情况下,这种行为被视为不受欢迎的,并且很可能通过设置additivity 属性值为false将它禁用 。)
Once an event reaches a logger with its additivity set to false the event will not be passed to any of its parent loggers, regardless of their additivity setting.(一旦一个事件传递到一个additivity属性值为false的logger ,这个事件就不会再被传递到它的父loggers ) Automatic Reconfiguration(自动重新配置)When configured from a File, Log4j has the ability to automatically detect changes to the configuration file and reconfigure itself. If the monitorInterval attribute is specified on the configuration element and is set to a non-zero value then the file will be checked the next time a log event is evaluated and/or logged and the monitorInterval has elapsed since the last check. The example below shows how to configure the attribute so that the configuration file will be checked for changes only after at least 30 seconds have elapsed. The minimum interval is 5 seconds.(当从配置文件中读取配置时,log4j具有自动检测配置文件变化和重新配置自身的能力。如果在配置元素上指定 monitorInterval 属性并且它的值为非0,则日志文件会在下一次的日志事件评估/日志记录并且经过monitorinterval设置的时间后被重新检查。下面的示例演示如何配置属性,以便在至少30秒之后检查配置文件的更改。最小间隔为5秒。)
Chainsaw can automatically process your log files (Advertising appender configurations)(Chainsaw能够自动处理你的日志文件(通知 appender 配置))Log4j provides the ability to ‘advertise‘ appender configuration details for all file-based appenders as well as socket-based appenders. For example, for file-based appenders, the file location and the pattern layout in the file are included in the advertisement. Chainsaw and other external systems can discover these advertisements and use that information to intelligently process the log file.(log4j提供了为所有基于文件以及基于Socket的appenders ‘宣传’ appender的配置细节的能力 。例如,基于文件的appender,它们的文件位置和pattern layout都被包含在”广告“中。Chainsaw 和其他外部系统可以发现这些”广告“并使用这些信息智能化地处理日志文件) The mechanism by which an advertisement is exposed, as well as the advertisement format, is specific to each Advertiser implementation. An external system which would like to work with a specific Advertiser implementation must understand how to locate the advertised configuration as well as the format of the advertisement. For example, a ‘database‘ Advertiser may store configuration details in a database table. An external system can read that database table in order to discover the file location and the file format.(针对每个广告商实现 都有其广告暴露的机制,以及这个广告的格式。要与特定的广告商实现一起工作的外部系统必须了解如何定位广告配置以及广告格式。例如,“数据库”广告商可以将配置细节存储在数据库表中。外部系统可以读取数据库表以发现文件位置和文件格式。) Log4j provides one Advertiser implementation, a ‘multicastdns‘ Advertiser, which advertises appender configuration details via IP multicast using the http://jmdns.sourceforge.net library.(Log4j提供了一个广告商实现---‘multicastdns‘ Advertiser 它会通过使用 http://jmdns.sourceforge.net 库的IP广播对appender的配置细节进行广告) Chainsaw automatically discovers log4j‘s multicastdns-generated advertisements and displays those discovered advertisements in Chainsaw‘s Zeroconf tab (if the jmdns library is in Chainsaw‘s classpath). To begin parsing and tailing a log file provided in an advertisement, just double-click the advertised entry in Chainsaw‘s Zeroconf tab. Currently, Chainsaw only supports FileAppender advertisements.(Chainsaw 自动发现Log4j的multicastdns生成的广告并且会在 Chainsaw‘s Zeroconf tab 展示那些被发现的广告(如果jmdnslibrary 在Chainsaw的 classpath)。开始解析并且跟踪在广告中提供的日志文件,只要在Chainsaw的Zeroconf tab 中双击广告记录。目前,Chainsaw 只支持FileAppender广告。) To advertise an appender configuration:(为了广告一个appender 的配置:)
FileAppender-based configurations require an additional ‘advertiseURI‘ attribute to be specified on the appender. The ‘advertiseURI‘ attribute provides Chainsaw with information on how the file can be accessed. For example, the file may be remotely accessible to Chainsaw via ssh/sftp by specifying a Commons VFS (http://commons.apache.org/proper/commons-vfs/) sftp:// URI, an http:// URI may be used if the file is accessible through a web server, or a file:// URI can be specified if accessing the file from a locally-running instance of Chainsaw.(基于FileAppender 的配置需要指定一个额外的 ‘advertiseURI‘ 。‘advertiseURI‘ 将如何去访问文件的信息提供给Chainsaw。例如,文件可能要Chainsaw 通过 ssh/sftp 进行远程访问,通过指定一个通用的VFS (http://commons.apache.org/proper/commons-vfs/) sftp:// URI ,如果文件可以通过web 服务器访问可以使用 http:// URI,如果可以通过本地允许的Chainsaw 实例来访问文件则可以使用file:// URI ) Here is an example advertisement-enabled appender configuration which can be used by a locally-running Chainsaw to automatically tail the log file (notice the file:// advertiseURI):(这是一个激活了广告的appender配置,它可以使用本地允许的Chainsaw 来自动跟踪日志文件 (注意使用 file:// advertiseURI)) Please note, you must add the JmDns library from http://jmdns.sourceforge.net to your application classpath in order to advertise with the ‘multicastdns‘ advertiser.(请注意,你一定要从http://jmdns.sourceforge.net 将JmDns 库添加到你的应用程序中的classpath ,这样才能够成功使用 ‘multicastdns‘ 进行广告。 )
Configuration Syntax(配置语法)As the previous examples have shown as well as those to follow, Log4j allows you to easily redefine logging behavior without needing to modify your application. It is possible to disable logging for certain parts of the application, log only when specific criteria are met such as the action being performed for a specific user, route output to Flume or a log reporting system, etc. Being able to do this requires understanding the syntax of the configuration files.(如前面的例子所显示的那样,Log4j允许您轻松地重新定义记录行为,而不需要修改应用程代码。可以禁用应用程序的某些部分的日志,日志只有当特定条件满足才会将日志信息输出到Flume 或日志报告系统等。要能够做到这一点需要去了解配置文件的语法。) The configuration element in the XML file accepts several attributes:(在XML文件中的配置元素接受的几个属性:)
Log4j can be configured using two XML flavors; concise and strict. The concise format makes configuration very easy as the element names match the components they represent however it cannot be validated with an XML schema. For example, the ConsoleAppender is configured by declaring an XML element named Console under its parent appenders element. However, element and attribute names are are not case sensitive. In addition, attributes can either be specified as an XML attribute or as an XML element that has no attributes and has a text value. So(Log4j能够使用XML风格进行配置;简洁的或者是严格的。简洁的格式使得配置非常容易,因为元素名匹配了他们表示的组件,即使它在XML schema中校验不通过。例如,可以在父appenders下申明一个叫做Console的XML元素来配置一个 ConsoleAppender 。但是元素和属性名是不区分大小写的。此外,属性也可以指定为一个没有属性只有一个文本值得XML元素。) <PatternLayoutpattern="%m%n"/> and <PatternLayout><Pattern>%m%n</Pattern></PatternLayout> are equivalent. The file below represents the structure of an XML configuration, but note that the elements in italics below represent the concise element names that would appear in their place.(下面的文件呈现的是一个XML配置的结构,但是注意下面的斜体内容表示是简洁方式配置的。)
See the many examples on this page for sample appender, filter and logger declarations.(查看该页面的更多其它的例子来比较sample appender, filter and logger declarations) Strict XML(严格模式)In addition to the concise XML format above, Log4j allows configurations to be specified in a more "normal" XML manner that can be validated using an XML Schema. This is accomplished by replacing the friendly element names above with their object type as shown below. For example, instead of the ConsoleAppender being configuerd using an element named Console it is instead configured as an appender element with a type attribute containing "Console".(此外)
Below is a sample configuration using the strict format.(使用严格模式的一个例子)
Configuration with JSONIn addition to XML, Log4j can be configured using JSON. The JSON format is very similar to the concise XML format. Each key represents the name of a plugin and the key/value pairs associated with it are its attributes. Where a key contains more than a simple value it itself will be a subordinate plugin. In the example below, ThresholdFilter, Console, and PatternLayout are all plugins while the Console plugin will be assigned a value of STDOUT for its name attribute and the ThresholdFilter will be assigned a level of debug.
Note that in the RoutingAppender the Route element has been declared as an array. This is valid because each array element will be a Route component. This won‘t work for elements such as appenders and filters, where each element has a different name in the concise format. Appenders and filters can be defined as array elements if each appender or filter declares an attribute named "type" that contains the type of the appender. The following example illustrates this as well as how to declare multiple loggers as an array.
The JSON support uses the Jackson Data Processor to parse the JSON files. These dependencies must be added to a project that wants to use JSON for configuration:
Configuration with YAMLLog4j also supports using YAML for configuration files. The structure follows the same pattern as both the XML and YAML configuration formats. For example:
In order to use YAML configuration files, the Jackson YAML data format must be included:
Configuring loggersAn understanding of how loggers work in Log4j is critical before trying to configure them. Please reference the Log4j architecture if more information is required. Trying to configure Log4j without understanding those concepts will lead to frustration.(在尝试配置日志记录器 前, 理解它们是如何工作的是非常重要的。如果需要更多的信息请参考Log4j architecture 。在没有理解这些概念前尝试配置Log4j将会导致失败。) A LoggerConfig is configured using the logger element. The logger element must have a name attribute specified, will usually have a level attribute specified and may also have an additivity attribute specified. The level may be configured with one of TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF. If no level is specified it will default to ERROR. The additivity attribute may be assigned a value of true or false. If the attribute is omitted the default value of false will be used.(使用logger 元素来配置日志记录器。 logger 元素一定要指定一个name属性,通常还会指定level和additivity属性。level属性值可以为 TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF之一。如果没有指定level属性,则默认的为error。additivity属性值可以为true或false,它的默认值为false。) A LoggerConfig (including the root LoggerConfig) can be configured with properties that will be added to the properties copied from the ThreadContextMap. These properties can be referenced from Appenders, Filters, Layouts, etc just as if they were part of the ThreadContext Map. The properties can contain variables that will be resolved either when the configuration is parsed or dynamically when each event is logged. See Property Substitution for more information on using variables.(LoggerConfig(包括root LogerConfig)都可以使用从ThreadContextMap 拷贝过来的属性进行配置。这些属性可以被 Appenders, Filters, Layouts 等引用,就好像它们是ThreadContext Map 的一部分。这些属性中可以包含变量,它们会在分析配置文件的时候被解析或者当日志被记录的时候动态解析。如何使用变量,查看 Property Substitution) The LoggerConfig may also be configured with one or more AppenderRef elements. Each appender referenced will become associated with the specified LoggerConfig. If multiple appenders are configured on the LoggerConfig each of them be called when processing logging events.(LoggerConfig也可以使用一个或多个AppenderRef引用元素进行配置。如果在一个LoggerConfig中配置多个appenders,当处理日志事件的时候,每个appender都会被调用) Every configuration must have a root logger. If one is not configured the default root LoggerConfig, which has a level of ERROR and has a Console appender attached, will be used. The main differences between the root logger and other loggers are(每一个配置都必须有一个root logger。如果没有配置,一个默认的root LoggerConfig就会被使用,它的级别为ERROR并且有一个Console的appender。root logger和其它的logger的主要区别为:)
Configuring Appenders(配置Appender元素)An appender is configured either using the specific appender plugin‘s name or with an appender element and the type attibute containing the appender plugin‘s name. In addition each appender must have a name attribute specified with a value that is unique within the set of appenders. The name will be used by loggers to reference the appender as described in the previous section.(appender要么是通过使用一个指定的appender插件的名称进行配置,要么是通过一个appender元素并且type属性的值为appender插件的名称进行配置。此外每一个appender一定要指定一个在appenders集合中独一无二的name属性。这个name属性会被logger的AppenderRef引用) Most appenders also support a layout to be configured which again may be specified either using the specific Layout plugin‘s name as the element or with "layout" as the element name along with a type attribute that contains the layout plugin‘s name. The various appenders will contain other attributes or elements that are required for them to function properly.(大多数的appenders也支持配置layout,layout可以通过指定Layout插件的名称进行配置,也可以通过使用“layout”作为元素名并为其指定type属性(type属性的值为layout插件的名称)。各种各样的appender将包含其他属性或是他们的正常功能所需的元素 ) Configuring Filters(配置过滤器元素)Log4j allows a filter to be specified in any of 4 places:(Log4j允许在4个位置配置过滤器元素)
Although only a single filter element can be configured, that element may be the filters element which represents the CompositeFilter. The filters element allows any number of filter elements to be configured within it. The following example shows how multiple filters can be configured on the ConsoleAppender.(即使只有一个过滤器可以配置,这个元素可能是filters 元素,它表示过滤元素的复合。可以在filters 元素中配置任意个 filter 元素。下面的例子显示在ConsoleAppender中配置多个filter )
Configuration with PropertiesAs of version 2.4, Log4j now supports configuration via properties files. Note that the property syntax is NOT the same as the syntax used in Log4j 1. Like the XML and JSON configurations, properties configurations define the configuration in terms of plugins and attributes to the plugins. Prior to version 2.6, the properties configuration requires that you list the identifiers of the appenders, filters and loggers, in a comma separated list in properties with those names. Each of those components will then be expected to be defined in sets of properties that begin with component.<.identifier>.. The identifier does not have to match the name of the component being defined but must uniquely identify all the attributes and subcomponents that are part of the component. If the list of identifiers is not present the identier must not contain a ‘.‘. Each individual component MUST have a "type" attribute specified that identifies the component‘s Plugin type. As of version 2.6, this list of identifiers is no longer required as names are inferred upon first usage, however if you wish to use more complex identifies you must still use the list. If the list is present it will be used. Unlike the base components, when creating subcomponents you cannot specify an element containing a list of identifiers. Instead, you must define the wrapper element with its type as is shown in the policies definition in the rolling file appender below. You then define each of the subcomponents below that wrapper element, as the TimeBasedTriggeringPolicy and SizeBasedTriggeringPolicy are defined below. Properties configuration files support the advertiser, monitorInterval, name, packages, shutdownHook, shutdownTimeout, status, verbose, and dest attrbutes. See Configuration Syntax for the definitions of these attributes.
Property Substitution(属性替换)Log4j 2 supports the ability to specify tokens in the configuration as references to properties defined elsewhere. Some of these properties will be resolved when the configuration file is interpreted while others may be passed to components where they will be evaluated at runtime. To accomplish this, Log4j uses variations of Apache Commons Lang‘s StrSubstitutor and StrLookup classes. In a manner similar to Ant or Maven, this allows variables declared as ${name} to be resolved using properties declared in the configuration itself. For example, the following example shows the filename for the rolling file appender being declared as a property.(Log4j 2支持指定token,这些token可以被其它地方的属性进行引用。当配置文件被解释时,一些属性将被解决,而另一些属性将传递给组件,这些组件将在运行时对它们进行评估。为了实现这一目标,log4j的使用 Apache Commons Lang‘s StrSubstitutor 和StrLookup类的变量。在某种程度上类似于Ant或Maven,这允许变量声明为 ${name} ,它们会被解析成该配置文件中的name属性定义的值。例如,下面的示例显示rolling file appender的文件名被作为一个属性声明。 )
While this is useful, there are many more places properties can originate from. To accommodate this, Log4j also supports the syntax ${prefix:name} where the prefix identifies tells Log4j that variable name should be evaluated in a specific context. See the Lookups manual page for more details. The contexts that are built in to Logj4 are:(这是很有用的,但是引用的属性会来自于很多的地方。为了适应这种情况,log4j也支持语法 ${prefix:name} 在前缀标识告诉log4j,变量的名字应该在一个特定的上下文进行评估。看到Lookups 手册页来了解更多细节。建立在logj4的上下文包括:)
A default property map can be declared in the configuration file. If the value cannot be located in the specified lookup the value in the default property map will be used. The default map is pre-populated with a value for "hostName" that is the current system‘s host name or IP address and the "contextName" with is the value of the current logging context.(默认属性映射可以在配置文件中声明。如果该值不能位于指定的查找中,则将使用默认属性映射中的值。默认映射预填充的值为“主机名”是当前系统的主机名或IP地址和“contextname”是当前测试上下文的值。 ) Lookup Variables with Multiple Leading ‘$‘ Characters(查找多个前导"$"字符的变量)An interesting feature of StrLookup processing is that when a variable reference is declared with multiple leading ‘$‘ characters each time the variable is resolved the leading ‘$‘ is simply removed. In the previous example the "Routes" element is capable of resolving the variable at runtime. To allow this the prefix value is specified as a variable with two leading ‘$‘ characters. When the configuration file is first processed the first variable is simply removed. Thus, when the Routes element is evaluated at runtime it is the variable declaration "${sd:type}" which causes the event to be inspected for a StructuredDataMessage and if one is present the value of its type attribute to be used as the routing key. Not all elements support resolving variables at runtime. Components that do will specifically call that out in their documentation.(StrLookup 处理的一个有趣的特点是,当一个变量引用声明了多个前导‘$‘字符,在解析时只是简单的将‘$‘删除。在前面的示例中,“Routes”元素能够在运行时解决变量。为了允许这个,前缀值被指定为带有两个前导$字符的变量。当配置文件被第一次处理时,第一个变量会被删除。因此,当线路元件在运行时计算它的变量声明 "${sd:type}" ,这会引起事件来检查一个StructuredDataMessage 和如果类型属性的值存在则作为 routing key。不是所有元素都支持在运行时解析变量。组件将在其文档中明确调用该文件。 ) If no value is found for the key in the Lookup associated with the prefix then the value associated with the key in the properties declaration in the configuration file will be used. If no value is found the variable declaration will be returned as the value. Default values may be declared in the configuration by doing:(如果与前缀相关联的查找中的键没有找到值,则将使用配置文件中的属性声明中的键关联的值。如果没有找到值,变量声明将被作为值返回。默认值可以在配置中声明 ,如下:)
As a footnote, it is worth pointing out that the variables in the RollingFile appender declaration will also not be evaluated when the configuration is processed. This is simply because the resolution of the whole RollingFile element is deferred until a match occurs. See RoutingAppender for more information.(作为一个注脚,值得指出的是,当配置文件被处理的时候,在rollingfile appender声明中的变量也不会被评估时。这是因为整个rollingfile元素的解析被推迟到匹配发生的时候。更多信息见RoutingAppender。 ) Scripts(脚本)Log4j provides support for JSR 223 scripting languages to be used in some of its components. Any language that provides support for the JSR 223 scripting engine may be used. A list of the languages and bindings for them can be found at the Scripting Engine web site. However, some of the languages listed there, such as JavaScript, Groovy and Beanshell, directly support the JSR 223 scripting framework and only require that the jars for that language be installed. The components that support using scripts do so by allowing a <script>, <scriptFile>, or <scriptRef> element to be configured on them. The script element contains a name for the script, the language of the script, and the script text. The scriptFile element contains the name of the script, its location, its language, its charset, and whether the file should be watched for changes. The scriptRef element contains the name of the script that is defined in the <scripts> configuration element. The name of the script is used to store the script, along with its ScriptEngine, so it can quickly be located each time the script needs to be run. While the name is not required, providing it will help in debugging problems when the script is running. The language must be provided on the script element and must specify one of the language names that appear in the Configuration status log as described in the next section. If the language is not specified on the scriptFile element the language will be determined by the file extension of the script path. If file monitoring is requested it will only be enabled if a non-zero monitorInterval is specified on the configuration element. That interval will be used to check for changes in the file.
If the status attribute on the Configuration element is set to DEBUG the list of script engines currently installed and their attributes will be listed. Although some engines may say they are not thread safe, Log4j takes steps to insure that the scripts will run in a thread-safe manner if the engine advertises that it is not thread safe. 2015-09-27 16:13:22,925 main DEBUG Installed script engines 2015-09-27 16:13:22,963 main DEBUG AppleScriptEngine Version: 1.1, Language: AppleScript, Threading: Not Thread Safe, Compile: false, Names: {AppleScriptEngine, AppleScript, OSA} 2015-09-27 16:13:22,983 main DEBUG Groovy Scripting Engine Version: 2.0, Language: Groovy, Threading: MULTITHREADED, Compile: true, Names: {groovy, Groovy} 2015-09-27 16:13:23,030 main DEBUG BeanShell Engine Version: 1.0, Language: BeanShell, Threading: MULTITHREADED, Compile: true, Names: {beanshell, bsh, java} 2015-09-27 16:13:23,039 main DEBUG Mozilla Rhino Version: 1.7 release 3 PRERELEASE, Language: ECMAScript, Threading: MULTITHREADED, Compile: true, Names: {js, rhino, JavaScript, javascript, ECMAScript, ecmascript} When the scripts are executed they will be provided with a set of variables that should allow them to accomplish whatever task they are expected to perform. See the documentation for the individual components for the list of variables that are available to the script. The components that support scripting expect a return value to be passed back to the calling Java code. This is not a problem for several of the scripting languages, but Javascript does not allow a return statement unless it is within a function. However, Javascript will return the value of the last statement executed in the script. As a consequence, code such as that shown below will result in the desired behavior. var result; if (logEvent.getLoggerName().equals("JavascriptNoLocation")) { result = "NoLocation"; } else if (logEvent.getMarker() != null && logEvent.getMarker().isInstanceOf("FLOW")) { result = "Flow"; } result; A special note on BeanshellJSR 223 scripting engines are supposed to identify that they support the Compilable interface if they support compiling their scripts. Beanshell does this. However, whenever the compile method is called it throws an Error (not an Exception). Log4j catches this but will log the warning shown below for each Beanshell script when it tries to compile them. All Beanshell scripts will then be interpreted on each execution. 2015-09-27 16:13:23,095 main DEBUG Script BeanShellSelector is compilable 2015-09-27 16:13:23,096 main WARN Error compiling script java.lang.Error: unimplemented at bsh.engine.BshScriptEngine.compile(BshScriptEngine.java:175) at bsh.engine.BshScriptEngine.compile(BshScriptEngine.java:154) at org.apache.logging.log4j.core.script.ScriptManager$MainScriptRunner.<init>(ScriptManager.java:125) at org.apache.logging.log4j.core.script.ScriptManager.addScript(ScriptManager.java:94) XIncludeXML configuration files can include other files with XInclude. Here is an example log4j2.xml file that includes two other files:
log4j-xinclude-appenders.xml:
log4j-xinclude-loggers.xml:
Composite ConfigurationLog4j allows multiple configuration files to be used by specifying them as a list of comma separated file paths on log4j.configurationFile. The merge logic can be controlled by specifying a class that implements the MergeStrategy interface on the log4j.mergeStrategy property. The default merge strategy will merge the files using the following rules:
Status Messages
Just as it is desirable to be able to diagnose problems in applications, it is frequently necessary to be able to diagnose problems in the logging configuration or in the configured components. Since logging has not been configured, "normal" logging cannot be used during initialization. In addition, normal logging within appenders could create infinite recursion which Log4j will detect and cause the recursive events to be ignored. To accomodate this need, the Log4j 2 API includes a StatusLogger. Components declare an instance of the StatusLogger similar to: protectedfinalstaticLogger logger =StatusLogger.getLogger(); Since StatusLogger implements the Log4j 2 API‘s Logger interface, all the normal Logger methods may be used. When configuring Log4j it is sometimes necessary to view the generated status events. This can be accomplished by adding the status attribute to the configuration element or a default value can be provided by setting the "Log4jDefaultStatusLevel" system property. Valid values of the status attribute are "trace", "debug", "info", "warn", "error" and "fatal". The following configuration has the status attribute set to debug.
During startup this configuration produces: 2011-11-23 17:08:00,769 DEBUG Generated plugins in 0.003374000 seconds 2011-11-23 17:08:00,789 DEBUG Calling createProperty on class org.apache.logging.log4j.core.config.Property for element property with params(name="filename", value="http://www.mamicode.com/target/rolling1/rollingtest-${sd:type}.log") 2011-11-23 17:08:00,792 DEBUG Calling configureSubstitutor on class org.apache.logging.log4j.core.config.PropertiesPlugin for element properties with params(properties={filename=target/rolling1/rollingtest-${sd:type}.log}) 2011-11-23 17:08:00,794 DEBUG Generated plugins in 0.001362000 seconds 2011-11-23 17:08:00,797 DEBUG Calling createFilter on class org.apache.logging.log4j.core.filter.ThresholdFilter for element ThresholdFilter with params(level="debug", onMatch="null", onMismatch="null") 2011-11-23 17:08:00,800 DEBUG Calling createLayout on class org.apache.logging.log4j.core.layout.PatternLayout for element PatternLayout with params(pattern="%m%n", Configuration(RoutingTest), null, charset="null") 2011-11-23 17:08:00,802 DEBUG Generated plugins in 0.001349000 seconds 2011-11-23 17:08:00,804 DEBUG Calling createAppender on class org.apache.logging.log4j.core.appender.ConsoleAppender for element Console with params(PatternLayout(%m%n), null, target="null", name="STDOUT", ignoreExceptions="null") 2011-11-23 17:08:00,804 DEBUG Calling createFilter on class org.apache.logging.log4j.core.filter.ThresholdFilter for element ThresholdFilter with params(level="debug", onMatch="null", onMismatch="null") 2011-11-23 17:08:00,806 DEBUG Calling createAppender on class org.apache.logging.log4j.test.appender.ListAppender for element List with params(name="List", entryPerNewLine="null", raw="null", null, ThresholdFilter(DEBUG)) 2011-11-23 17:08:00,813 DEBUG Calling createRoute on class org.apache.logging.log4j.core.appender.routing.Route for element Route with params(AppenderRef="null", key="null", Node=Route) 2011-11-23 17:08:00,823 DEBUG Calling createRoute on class org.apache.logging.log4j.core.appender.routing.Route for element Route with params(AppenderRef="STDOUT", key="Audit", Node=Route) 2011-11-23 17:08:00,824 DEBUG Calling createRoute on class org.apache.logging.log4j.core.appender.routing.Route for element Route with params(AppenderRef="List", key="Service", Node=Route) 2011-11-23 17:08:00,825 DEBUG Calling createRoutes on class org.apache.logging.log4j.core.appender.routing.Routes for element Routes with params(pattern="${sd:type}", routes={Route(type=dynamic default), Route(type=static Reference=STDOUT key=‘Audit‘), Route(type=static Reference=List key=‘Service‘)}) 2011-11-23 17:08:00,827 DEBUG Calling createAppender on class org.apache.logging.log4j.core.appender.routing.RoutingAppender for element Routing with params(name="Routing", ignoreExceptions="null", Routes({Route(type=dynamic default),Route(type=static Reference=STDOUT key=‘Audit‘),Route(type=static Reference=List key=‘Service‘)}), Configuration(RoutingTest), null, null) 2011-11-23 17:08:00,827 DEBUG Calling createAppenders on class org.apache.logging.log4j.core.config.AppendersPlugin for element appenders with params(appenders={STDOUT, List, Routing}) 2011-11-23 17:08:00,828 DEBUG Calling createAppenderRef on class org.apache.logging.log4j.core.config.plugins.AppenderRefPlugin for element AppenderRef with params(ref="Routing") 2011-11-23 17:08:00,829 DEBUG Calling createLogger on class org.apache.logging.log4j.core.config.LoggerConfig for element logger with params(additivity="false", level="info", name="EventLogger", AppenderRef={Routing}, null) 2011-11-23 17:08:00,830 DEBUG Calling createAppenderRef on class org.apache.logging.log4j.core.config.plugins.AppenderRefPlugin for element AppenderRef with params(ref="STDOUT") 2011-11-23 17:08:00,831 DEBUG Calling createLogger on class org.apache.logging.log4j.core.config.LoggerConfig$RootLogger for element root with params(additivity="null", level="error", AppenderRef={STDOUT}, null) 2011-11-23 17:08:00,833 DEBUG Calling createLoggers on class org.apache.logging.log4j.core.config.LoggersPlugin for element loggers with params(loggers={EventLogger, root}) 2011-11-23 17:08:00,834 DEBUG Reconfiguration completed 2011-11-23 17:08:00,846 DEBUG Calling createLayout on class org.apache.logging.log4j.core.layout.PatternLayout for element PatternLayout with params(pattern="%d %p %c{1.} [%t] %m%n", Configuration(RoutingTest), null, charset="null") 2011-11-23 17:08:00,849 DEBUG Calling createPolicy on class org.apache.logging.log4j.core.appender.rolling.SizeBasedTriggeringPolicy for element SizeBasedTriggeringPolicy with params(size="500") 2011-11-23 17:08:00,851 DEBUG Calling createAppender on class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFile with params(fileName="target/rolling1/rollingtest-Unknown.log", filePattern="target/rolling1/test1-Unknown.%i.log.gz", append="null", name="Rolling-Unknown", bufferedIO="null", immediateFlush="null", SizeBasedTriggeringPolicy(SizeBasedTriggeringPolicy(size=500)), null, PatternLayout(%d %p %c{1.} [%t] %m%n), null, ignoreExceptions="null") 2011-11-23 17:08:00,858 DEBUG Generated plugins in 0.002014000 seconds 2011-11-23 17:08:00,889 DEBUG Reconfiguration started for context sun.misc.Launcher$AppClassLoader@37b90b39 2011-11-23 17:08:00,890 DEBUG Generated plugins in 0.001355000 seconds 2011-11-23 17:08:00,959 DEBUG Generated plugins in 0.001239000 seconds 2011-11-23 17:08:00,961 DEBUG Generated plugins in 0.001197000 seconds 2011-11-23 17:08:00,965 WARN No Loggers were configured, using default 2011-11-23 17:08:00,976 DEBUG Reconfiguration completed If the status attribute is set to error than only error messages will be written to the console. This makes troubleshooting configuration errors possible. As an example, if the configuration above is changed to have the status set to error and the logger declaration is:
the following error message will be produced. 2011-11-24 23:21:25,517 ERROR Unable to locate appender Routng for logger EventLogger Applications may wish to direct the status output to some other destination. This can be accomplished by setting the dest attribute to either "err" to send the output to stderr or to a file location or URL. This can also be done by insuring the configured status is set to OFF and then configuring the application programmatically such as:
Testing in MavenMaven can run unit and functional tests during the build cycle. By default, any files placed in src/test/resources are automatically copied to target/test-classes and are included in the classpath during execution of any tests. As such, placing a log4j2-test.xml into this directory will cause it to be used instead of a log4j2.xml or log4j2.json that might be present. Thus a different log configuration can be used during testing than what is used in production. A second approach, which is extensively used by Log4j 2, is to set the log4j.configurationFile property in the method annotated with @BeforeClass in the junit test class. This will allow an arbitrarily named file to be used during the test. A third approach, also used extensively by Log4j 2, is to use the LoggerContextRule JUnit test rule which provides additional convenience methods for testing. This requires adding the log4j-core test-jar dependency to your test scope dependencies. For example:
System PropertiesThe Log4j documentation references a number of System Properties that can be used to control various aspects of Log4j 2 behavior. The table below lists these properties along with their default value and a description of what they control. Any spaces present in the property name are for visual flow and should be removed. The properties listed below can also be specified by creating a file named log4j2.component.properties, adding the desired keys and value to the file, and then including the file in the classpath of the application.
|
Copyright ? 1999-2017 Apache Software Foundation. All Rights Reserved.
Apache Logging, Apache Log4j, Log4j, Apache, the Apache feather logo, and the Apache Logging project logo are trademarks of The Apache Software Foundation.
Site powered by Twitter Bootstrap. Icons from Glyphicons Free.
Log4j – Configuring Log4j 2 - Apache Log4j 2