将日志请求插入到应用程序代码中需要进行大量的计划和工作。
观察表明,大约4%的代码专门用于日志记录。因此,即使是中等规模的应用程序也会在其代码中嵌入数千条日志记录语句。
考虑到它们的数量,必须管理这些日志语句,而不需要手动修改它们。
Log4j 2的配置可以通过以下四种方式之一完成:
通过用XML、JSON、YAML或属性格式编写的配置文件。
通过编程方式,创建一个ConfigurationFactory和Configuration实现。
通过编程方式,调用Configuration接口中公开的api,将组件添加到默认配置中。
以编程方式,通过调用内部Logger类上的方法。
本页主要关注通过配置文件配置Log4j。关于以编程方式配置Log4j的信息可以在扩展Log4j 2和程序化Log4j配置中找到。
所有可用的格式在功能上都是相同的。
例如,可以使用属性格式重写XML中的配置文件(反之亦然),而不会损失任何功能。
但是,使用自然支持嵌套的格式可以更好地捕获Log4j配置的层次结构特性,因此XML、JSON和YAML文件通常更易于使用。
注意,这与Log4j 1不同。因此,公共Log4j 2 API不公开添加、修改或删除追加程序和过滤器的方法,也不公开以任何方式操纵配置的方法。
Log4j可以使用两种XML样式进行配置;简洁严谨。
简洁的格式使得配置非常容易,因为元素名称与其所代表的组件相匹配,但是不能用XML模式进行验证。
例如,通过在其父appenders元素下声明一个名为Console的XML元素来配置ConsoleAppender。但是,元素和属性名不区分大小写。
此外,属性既可以指定为XML属性,也可以指定为没有属性但有文本值的XML元素。所以
<PatternLayout pattern="%m%n"/>
和
<PatternLayout>
<Pattern>%m%nPattern>
PatternLayout>
是等价的。
下面的文件表示XML配置的结构,但请注意,下面斜体中的元素表示将出现在其位置上的简洁元素名称。
;
<Configuration>
<Properties>
<Property name="name1">valueproperty>
<Property name="name2" value="value2"/>
Properties>
<filter ... />
<Appenders>
<appender ... >
<filter ... />
appender>
...
Appenders>
<Loggers>
<Logger name="name1">
<filter ... />
Logger>
...
<Root level="level">
<AppenderRef ref="name"/>
Root>
Loggers>
Configuration>
请参阅本页中的许多示例,以了解附加程序、过滤器和日志记录器声明的示例。
除了上面简明的XML格式之外,Log4j还允许以一种更“正常”的XML方式指定配置,这种方式可以使用XML Schema进行验证。
这是通过用对象类型替换上面友好的元素名称来实现的,如下所示。
例如,不是使用名为Console的元素配置ConsoleAppender,而是将其配置为带有type属性“Console”的appender元素。
;
<Configuration>
<Properties>
<Property name="name1">valueproperty>
<Property name="name2" value="value2"/>
Properties>
<Filter type="type" ... />
<Appenders>
<Appender type="type" name="name">
<Filter type="type" ... />
Appender>
...
Appenders>
<Loggers>
<Logger name="name1">
<Filter type="type" ... />
Logger>
...
<Root level="level">
<AppenderRef ref="name"/>
Root>
Loggers>
Configuration>
下面是使用严格格式的样例配置。
<Configuration status="debug" strict="true" name="XMLConfigTest"
packages="org.apache.logging.log4j.test">
<Properties>
<Property name="filename">target/test.logProperty>
Properties>
<Filter type="ThresholdFilter" level="trace"/>
<Appenders>
<Appender type="Console" name="STDOUT">
<Layout type="PatternLayout" pattern="%m MDC%X%n"/>
<Filters>
<Filter type="MarkerFilter" marker="FLOW" onMatch="DENY" onMismatch="NEUTRAL"/>
<Filter type="MarkerFilter" marker="EXCEPTION" onMatch="DENY" onMismatch="ACCEPT"/>
Filters>
Appender>
<Appender type="Console" name="FLOW">
<Layout type="PatternLayout" pattern="%C{1}.%M %m %ex%n"/>
<Filters>
<Filter type="MarkerFilter" marker="FLOW" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
<Filter type="MarkerFilter" marker="EXCEPTION" onMatch="ACCEPT" onMismatch="DENY"/>
Filters>
Appender>
<Appender type="File" name="File" fileName="${filename}">
<Layout type="PatternLayout">
<Pattern>%d %p %C{1.} [%t] %m%nPattern>
Layout>
Appender>
Appenders>
<Loggers>
<Logger name="org.apache.logging.log4j.test1" level="debug" additivity="false">
<Filter type="ThreadContextMapFilter">
<KeyValuePair key="test" value="123"/>
Filter>
<AppenderRef ref="STDOUT"/>
Logger>
<Logger name="org.apache.logging.log4j.test2" level="debug" additivity="false">
<AppenderRef ref="File"/>
Logger>
<Root level="trace">
<AppenderRef ref="STDOUT"/>
Root>
Loggers>
Configuration>