打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Log4j2
userphoto

2015.12.30

关注

一个应用程序需要写入大量的日志,根据统计大概有4%的代码量是写入日志。即使这样一个中等类型的应用程序也有成千上万的日志记录代码。那么急需一个统一的管理工具。log4j2就是这样的一个日志记录工具。

配置Log4j 2可以有四种方法(其中任何一种都可以):

  1. 通过一个格式为XML或JSON的配置文件。
  2. 以编程方式,通过创建一个ConfigurationFactory工厂和Configuration实现。
  3. 以编程方式,通过调用api暴露在配置界面添加组件的默认配置。
  4. 以编程方式,通过调用Logger内部类上的方法。

这个页面主要集中于配置Log4j通过一个配置文件。 

注意,与Log4j 1. x不一样的地方,公开的Log4j 2 API没有提供任何添加、修改或删除 appender和过滤器或者操作配置文件的方法。

自动配置

Log4j能够自动配置本身在初始化期间。 当Log4j启动它将定位所有的ConfigurationFactory插件和安排然后在加权 订单从最高到最低。 传送,Log4j包含两个ConfigurationFactory实现, 一个用于JSON和XML。

  1. Log4j将检查“Log4j的配置文件“系统属性,如果设置,将尝试 加载配置使用 ConfigurationFactory 匹配的文件 扩展。
  2. 如果没有系统属性设置JSON ConfigurationFactory log4j2-test将寻找。 json或 log4j2-test。 jsn在类路径中。
  3. 如果没有这样的文件发现XML ConfigurationFactory log4j2-test将寻找。 xml在 类路径。
  4. 如果一个测试文件无法找到JSON ConfigurationFactory log4j2将寻找。 log4j2.jsn json或 在类路径中。
  5. 如果一个JSON文件无法找到XML ConfigurationFactory将试图定位 log4j2。 xml在类路径中。
  6. 如果没有配置文件可以找到了 DefaultConfiguration 将 被使用。 这将导致日志输出到控制台。

一个示例应用程序命名 myapp 使用log4j可以用来说明 这是做的。

 

  1. import com.foo.Bar;
  2. // Import log4j classes.
  3. import org.apache.logging.log4j.Logger;
  4. public class MyApp {
  5. // Define a static logger variable so that it references the
  6. // Logger instance named “MyApp”.
  7. Logger logger = LogManager.getLogger(MyApp.class.getName());
  8. public static void main(String[] args) {
  9. // Set up a simple configuration that logs on the console.
  10. logger.trace(“Entering application.”);
  11. Bar bar = new Bar();
  12. if (!bar.doIt() {
  13. logger.error(“Didn’t do it.”);
  14. }
  15. logger.trace(“Exiting application.”); }
  16. }

myapp 首先导入log4j相关类。 它 然后定义了一个静态变量名字。日志记录器 myapp 这恰好是类的完全限定名。

myapp 使用 酒吧 类中定义的包 com foo 

 

  1. package com.foo;
  2. import org.apache.logging.log4j.Logger;
  3. public class Bar {
  4. static Logger logger = LogManager.getLogger(Bar.class.getName());
  5. public boolean doIt() {
  6. logger.entry();
  7. logger.error(“Did it again!”);
  8. return logger.exit(false);
  9. }
  10. }

Log4j将提供一个默认的配置如果它不能找到一个配置文件。 默认 配置,提供DefaultConfiguration类,将设置:

  • 一个 ConsoleAppender 连接到根记录器。
  • 一个 PatternLayout 设置为模式“% d { HH:mm:ss。 SSS }[% t]% 5级%记录器{ 36 } – % % n”味精附加到ConsoleAppender

注意,默认情况下Log4j指定根记录器来 水平误差 

MyApp的输出将类似于:

  1. 17:13:01.540 [main] ERROR com.foo.Bar – Did it again!
  2. 17:13:01.540 [main] ERROR MyApp – Didn’t do it.

正如先前描述,Log4j配置本身首先尝试从配置文件。 一个 配置相当于默认会看起来像:

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <configuration status=”WARN”>
  3. <appenders>
  4. <Console name=”Console” target=”SYSTEM_OUT”>
  5. <PatternLayout pattern=”%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} – %msg%n”/>
  6. </Console>
  7. </appenders>
  8. <loggers>
  9. <root level=”error”>
  10. <appender-ref ref=”Console”/>
  11. </root>
  12. </loggers>
  13. </configuration>

一旦上述文件放到类路径log4j2。 xml你会得到结果相同 上面所列的那些。 改变根水平跟踪会导致结果类似于:

:13:01.540 [main] TRACE MyApp - Entering application.:13:01.540 [main] TRACE com.foo.Bar - entry:13:01.540 [main] ERROR com.foo.Bar - Did it again!:13:01.540 [main] TRACE com.foo.Bar - exit with (false):13:01.540 [main] ERROR MyApp - Didn't do it.:13:01.540 [main] TRACE MyApp - Exiting application.

注意,日志是禁用状态时使用的缺省配置。

也许这是理想,以消除所有的跟踪输出从除了 com foo酒吧 。 简单 修改日志级别不会完成任务。 相反,解决方法是 添加一个新logger定义配置:

  1. <logger name=”com.foo.Bar” level=”TRACE”/>
  2. <root level=”ERROR”>
  3. <appender-ref ref=”STDOUT”>
  4. </root>

在这个配置中所有日志事件 com foo酒吧 将会被记录在案,而只有错误事件会吗 被记录从所有其他组件。

相加性

在前面的例子中所有的事件 com foo酒吧 还写入控制台。 这是 因为记录器来 com foo酒吧 没有任何输出源配置,而其父确实。 事实上, 以下配置

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <configuration status=”WARN”>
  3. <appenders>
  4. <Console name=”Console” target=”SYSTEM_OUT”>
  5. <PatternLayout pattern=”%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} – %msg%n”/>
  6. </Console>
  7. </appenders>
  8. <loggers>
  9. <logger name=”com.foo.Bar” level=”trace”>
  10. <appender-ref ref=”Console”/>
  11. </logger>
  12. <root level=”error”>
  13. <appender-ref ref=”Console”/>
  14. </root>
  15. </loggers>
  16. </configuration>

会导致

  1. 17:13:01.540 [main] TRACE com.foo.Bar – entry
  2. 17:13:01.540 [main] TRACE com.foo.Bar – entry
  3. 17:13:01.540 [main] ERROR com.foo.Bar – Did it again!
  4. 17:13:01.540 [main] TRACE com.foo.Bar – exit (false)
  5. 17:13:01.540 [main] TRACE com.foo.Bar – exit (false)
  6. 17:13:01.540 [main] ERROR MyApp – Didn’t do it.

注意跟踪信息 com foo酒吧 出现两次。 这是因为appender相关 使用logger com foo酒吧 第一次使用时,写的第一个实例到控制台。 接下来,父 的 com foo酒吧 ,在这种情况下是根记录器,被引用。 事件随后被传递到它的 appender,也写入控制台,导致第二个实例。 这就是所谓的 可加性。 而加性可以很方便的特性(如第一之前举的 没有appender参考需要配置),在很多情况下,这种行为被认为是不可取的 所以可以禁用它通过设置添加属性记录器为假:

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <configuration status=”WARN”>
  3. <appenders>
  4. <Console name=”Console” target=”SYSTEM_OUT”>
  5. <PatternLayout pattern=”%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} – %msg%n”/>
  6. </Console>
  7. </appenders>
  8. <loggers>
  9. <logger name=”com.foo.Bar” level=”trace” additivity=”false”>
  10. <appender-ref ref=”Console”/>
  11. </logger>
  12. <root level=”error”>
  13. <appender-ref ref=”Console”/>
  14. </root>
  15. </loggers>
  16. </configuration>

一旦一个事件达到记录器以其可加性设置为假事件将不会被传递到 它的任何父伐木工,不管他们的添加设置。

自动重新配置

当从一个文件中配置,Log4j能够自动检测修改配置 文件和重新配置本身。 如果monitorInterval属性中指定的配置元素 和被设置为非零值然后文件将被检查下次日志事件进行了评价 和/或记录和monitorInterval已经过自上次检查。 下面这个例子说明了 配置属性,以便配置文件将被检查只有在变化 至少30秒已经过去。 最小间隔5秒。

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <configuration monitorInterval=”30″>
  3. </configuration>

广告Appender配置

Log4j提供能够公开appender配置外部系统当“广告” 属性的配置元素已经被指定。 广告是使个人appender通过设置 “广告”属性的“真正的”。appender

目前提供一个广告商实现Log4j:一个多播DNS广告,它可以用来检索和解析 一个日志文件或流程事件从一个基于socket的appender。 额外的Advetiser实现可能 写这利用其他机制公开appender配置——例如,通过公开 配置通过JMX或将其存储在数据库中。

支持多播的电锯发现配置文件的dns暴露appender和基于套接字的输出源。 当 发现一个广告电锯appender,电锯将显示一个条目的appender在ZeroConf”屏幕,用户可以 双击条目以便开始接收事件引起的appender,没有进一步的用户配置要求。

请注意,单个输出源可能要求额外的信息中提供的配置appender。 例如, 必须指定一个advertiseURI FileAppender可以用来检索文件的内容。 文件:/ / http://和Apache Commons vfs支持uri都由链锯。

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <configuration advertiser=”multicastdns”>
  3. </configuration>
  4. <appenders>
  5. <File name=”File1″ fileName=”target/test.log” bufferedIO=”false” advertiseURI=”file://path/to/output.log” advertise=”true”>
  6. </File>
  7. </appenders>

配置语法

与前面的示例显示以及那些追随,Log4j允许您轻松 定义日志记录的行为,而不需要修改应用程序。 它是可能的 禁用日志记录应用程序的某些部分,日志只有当特定的标准被遇见这样的 正在执行的操作是为一个特定的用户,路线输出量水槽或日志报告系统, 等。能够做这需要了解语法的配置文件。

配置XML

配置元素在XML文件接受几个属性:

属性名称描述
dest要么“犯错”,这将会将输出结果发送到stderr,或一个文件路径或URL。
monitorInterval最低数量的时间,以秒之前,必须经文件配置 是检查的变化。
名称配置的名称。
一个逗号分隔的列表来搜索插件包名称。 插件只加载 每一次改变这个值可能类加载器所以没有任何影响在重新配置。
模式标识位置的类加载器,找到XML Schema使用验证 配置。 只有有效当严格被设置为true。 如果没有设置任何模式验证 将发生。
状态这个级别的内部Log4j应该记录在事件的控制台。
严格允许使用严格的XML格式。 不支持在JSON配置。
详细使诊断信息而加载插件。

Log4j配置使用两个XML口味;简洁的和严格的。 简洁的格式使 配置很简单的元素名称匹配组件他们代表然而它 不能与XML模式进行验证。 例如,ConsoleAppender来进行配置 声明一个XML元素命名为控制台在其母appender元素。 然而,元素 和属性名称都是不区分大小写的。 另外,属性可以被指定 作为一个XML属性或一个XML元素,没有属性,有一个文本值。 所以

<patternLayout pattern="%m%n"/>

<PatternLayout>  <pattern>%m%n</pattern></PatternLayout>

是等价的。

下面的文件代表结构的XML配置,但注意 下面的元素在斜体代表简洁元素名称,就会出现在他们的地方。

  1. <?xml version=”1.0″ encoding=”UTF-8″?>;
  2. <configuration>
  3. <properties>
  4. <property name=”name1″>value</property>
  5. <property name=”name2″ value=”value2″/>
  6. </properties>
  7. <filter … />
  8. <appenders>
  9. <appender … >
  10. <filter … />
  11. </appender>
  12. </appenders>
  13. <loggers>
  14. <logger name=”name1″>
  15. <filter … />
  16. </logger>
  17. <root level=”level”>
  18. <appender-ref ref=”name”/>
  19. </root>
  20. </loggers>
  21. </configuration>

看到很多例子在这个页面示例appender,过滤器和记录器声明。

严格的XML

除了上面的简洁的XML格式,允许指定Log4j配置在一个 更“正常”的XML的方式,可以使用XML模式进行验证。 这是完成的 取代了友好元素名称和他们的对象类型之上,如下所示。 例如, 而不是被configuerd ConsoleAppender使用一个名为的元素控制台是相反 配置为一个appender元素类型属性包含“控制台”。

  1. <?xml version=”1.0″ encoding=”UTF-8″?>;
  2. <configuration>
  3. <properties>
  4. <property name=”name1″>value</property>
  5. <property name=”name2″ value=”value2″/>
  6. </properties>
  7. <filter type=”type” … />
  8. <appenders>
  9. <appender type=”type” name=”name”>
  10. <filter type=”type” … />
  11. </appender>
  12. </appenders>
  13. <loggers>
  14. <logger name=”name1″>
  15. <filter type=”type” … />
  16. </logger>
  17. <root level=”level”>
  18. <appender-ref ref=”name”/>
  19. </root>
  20. </loggers>
  21. </configuration>

下面是一个示例配置使用严格的格式。

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <configuration status=”debug” strict=”true” name=”XMLConfigTest”
  3. packages=”org.apache.logging.log4j.test”>
  4. <properties>
  5. <property name=”filename”>target/test.log</property>
  6. </properties>
  7. <filter type=”ThresholdFilter” level=”trace”/>
  8. <appenders>
  9. <appender type=”Console” name=”STDOUT”>
  10. <layout type=”PatternLayout” pattern=”%m MDC%X%n”/>
  11. <filters>
  12. <filter type=”MarkerFilter” marker=”FLOW” onMatch=”DENY” onMismatch=”NEUTRAL”/>
  13. <filter type=”MarkerFilter” marker=”EXCEPTION” onMatch=”DENY” onMismatch=”ACCEPT”/>
  14. </filters>
  15. </appender>
  16. <appender type=”Console” name=”FLOW”>
  17. <layout type=”PatternLayout” pattern=”%C{1}.%M %m %ex%n”/><!– class & line number –>
  18. <filters>
  19. <filter type=”MarkerFilter” marker=”FLOW” onMatch=”ACCEPT” onMismatch=”NEUTRAL”/>
  20. <filter type=”MarkerFilter” marker=”EXCEPTION” onMatch=”ACCEPT” onMismatch=”DENY”/>
  21. </filters>
  22. </appender>
  23. <appender type=”File” name=”File” fileName=”${filename}”>
  24. <layout type=”PatternLayout”>
  25. <pattern>%d %p %C{1.} [%t] %m%n</pattern>
  26. </layout>
  27. </appender>
  28. <appender type=”List” name=”List”>
  29. </appender>
  30. </appenders>
  31. <loggers>
  32. <logger name=”org.apache.logging.log4j.test1″ level=”debug” additivity=”false”>
  33. <filter type=”ThreadContextMapFilter”>
  34. <KeyValuePair key=”test” value=”123″/>
  35. </filter>
  36. <appender-ref ref=”STDOUT”/>
  37. </logger>>
  38. <logger name=”org.apache.logging.log4j.test2″ level=”debug” additivity=”false”>
  39. <appender-ref ref=”File”/>
  40. </logger>>
  41. <root level=”trace”>
  42. <appender-ref ref=”List”/>
  43. </root>
  44. </loggers>
  45. </configuration>

配置与JSON

除了XML,Log4j配置使用JSON。 JSON格式非常相似 简洁的XML格式。 每个键代表一个插件的名称和相关联的键/值对 它是它的属性。 一键包含不止一个简单的价值它本身就会成为一个吗 从属插件。 在下面的示例中,ThresholdFilter,控制台,PatternLayout都 插件虽然控制台插件将分配一个值为其名称属性的STDOUT和 我习惯他叫我亲爱的个级别的调试。

  1. { “configuration”: { “status”: “error”, “name”: “RoutingTest”,
  2. “packages”: “org.apache.logging.log4j.test”,
  3. “properties”: {
  4. “property”: { “name”: “filename”,
  5. “value” : “target/rolling1/rollingtest-$${sd:type}.log” }
  6. },
  7. “ThresholdFilter”: { “level”: “debug” },
  8. “appenders”: {
  9. “Console”: { “name”: “STDOUT”,
  10. “PatternLayout”: { “pattern”: “%m%n” }
  11. },
  12. “List”: { “name”: “List”,
  13. “ThresholdFilter”: { “level”: “debug” }
  14. },
  15. “Routing”: { “name”: “Routing”,
  16. “Routes”: { “pattern”: “$${sd:type}”,
  17. “Route”: [
  18. {
  19. "RollingFile": {
  20. "name": "Rolling-${sd:type}", "fileName": "${filename}",
  21. "filePattern": "target/rolling1/test1-${sd:type}.%i.log.gz",
  22. "PatternLayout": {"pattern": "%d %p %c{1.} [%t] %m%n”},
  23. “SizeBasedTriggeringPolicy”: { “size”: “500″ }
  24. }
  25. },
  26. { “appender-ref”: “STDOUT”, “key”: “Audit”},
  27. { “appender-ref”: “List”, “key”: “Service”}
  28. ]
  29. }
  30. }
  31. },
  32. “loggers”: {
  33. “logger”: { “name”: “EventLogger”, “level”: “info”, “additivity”: “false”,
  34. “appender-ref”: { “ref”: “Routing” }},
  35. “root”: { “level”: “error”, “appender-ref”: { “ref”: “STDOUT” }}
  36. }
  37. }
  38. }

注意,在RoutingAppender路线元素已经被声明为一个数组。 这是 有效,因为每个数组元素将一个路由组件。 这工作不了等元素 appender和过滤器,其中每个元素都有一个不同的名字在简洁的格式。 appender和 过滤器可以被定义为数组元素如果每个appender或过滤器属性声明了一个名为“类型” 包含类型的appender。 下面的例子说明了这个以及如何 作为一个数组声明多个伐木工。

  1. { “configuration”: { “status”: “debug”, “name”: “RoutingTest”,
  2. “packages”: “org.apache.logging.log4j.test”,
  3. “properties”: {
  4. “property”: { “name”: “filename”,
  5. “value” : “target/rolling1/rollingtest-$${sd:type}.log” }
  6. },
  7. “ThresholdFilter”: { “level”: “debug” },
  8. “appenders”: {
  9. “appender”: [
  10. { "type": "Console", "name": "STDOUT", "PatternLayout": { "pattern": "%m%n" }},
  11. { "type": "List", "name": "List", "ThresholdFilter": { "level": "debug" }},
  12. { "type": "Routing", "name": "Routing",
  13. "Routes": { "pattern": "$${sd:type}",
  14. "Route": [
  15. {
  16. "RollingFile": {
  17. "name": "Rolling-${sd:type}", "fileName": "${filename}",
  18. "filePattern": "target/rolling1/test1-${sd:type}.%i.log.gz",
  19. "PatternLayout": {"pattern": "%d %p %c{1.} [%t] %m%n”},
  20. “SizeBasedTriggeringPolicy”: { “size”: “500″ }
  21. }
  22. },
  23. { “appender-ref”: “STDOUT”, “key”: “Audit”},
  24. { “appender-ref”: “List”, “key”: “Service”}
  25. ]
  26. }
  27. }
  28. ]
  29. },
  30. “loggers”: {
  31. “logger”: [
  32. { "name": "EventLogger", "level": "info", "additivity": "false",
  33. "appender-ref": { "ref": "Routing" }},
  34. { "name": "com.foo.bar", "level": "error", "additivity": "false",
  35. "appender-ref": { "ref": "Console" }}
  36. ],
  37. “root”: { “level”: “error”, “appender-ref”: { “ref”: “STDOUT” }}
  38. }
  39. }
  40. }

JSON支持使用杰克逊数据处理器解析JSON文件。 这些依赖关系必须被添加 一个项目要使用JSON的配置:

  1. <dependency>
  2. <groupId>com.fasterxml.jackson.core</groupId>
  3. <artifactId>jackson-core</artifactId>
  4. <version>2.2.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.fasterxml.jackson.core</groupId>
  8. <artifactId>jackson-databind</artifactId>
  9. <version>2.2.1</version>
  10. </dependency>

配置伐木工

了解如何在Log4j是关键伐木者工作之前试图配置它们。 请参考Log4j 架构 如果有更多的信息是 要求。 试图配置Log4j没有理解这些概念将会导致沮丧。

一个LoggerConfig配置使用 记录器 元素。 这个 记录器 元素 必须有一个name属性指定,通常会有一个级别属性指定,可能吗 也有一个添加属性指定的。 可以配置水平与跟踪, 调试信息、警告、错误、或关闭所有。如果没有指定水平将默认为错误。 这个 添加属性可以被分配一个值的真或假。 如果属性是省略了 默认值为false将被使用。

一个LoggerConfig(包括根LoggerConfig)可以配置属性,这些属性将被添加 在属性ThreadContextMap复制。 这些属性可以被引用从输出源, 过滤器、布局等,就像他们ThreadContext地图的一部分。 属性可以包含 变量,将解决要么当配置解析或动态当每个 事件记录。 看到 产权置换 更多信息 使用变量。

这个LoggerConfig也可以配置一个或多个appender ref元素。 每个appender 引用将成为与指定的LoggerConfig有关。 如果多个appender 在LoggerConfig配置每个人被称为当处理日志事件。

每个配置必须有一个根记录器 。 如果没有配置默认的根LoggerConfig, 这有一个级别的错误和有一个控制台appender附着,将被使用。 主要的差异 根记录器和其他之间的伐木者

  1. 根记录器没有名字属性。
  2. 根记录器不支持添加属性,因为它没有父母。

配置appender

一个appender配置要么通过特定的插件的名称或与appender一个appender 元素和类型attibute appender插件的名称包含。 此外每个appender 必须有一个name属性指定一个值,是独特的在组输出源。 这个名字将被用于伐木工引用appender像在前一节中描述。

大多数appender也支持一个布局配置(又一次可被指定要么 使用特定的布局插件的名称作为元素或与“布局”为元素的名字 随着一个type属性,其中包含插件的名字。布局 各种appender 将包含其他属性或元素为他们所需功能的正常运行。

配置过滤器

Log4j允许一个过滤器必须在任何地方的4:

  1. 在相同的高度上appender,伐木工和属性元素。 这些过滤器可以接受 或拒绝事件之前,他们已通过了一个LoggerConfig。
  2. 在一个logger元素。 这些过滤器可以接受或拒绝事件为特定的伐木工。
  3. 在一个appender元素。 这些过滤器可以预防或导致事件来处理 这个appender。
  4. 在一个appender参考元素。 这些过滤器是用来确定一个日志应该路线 事件与一个appender。

虽然只有一个 滤波器 可以配置元素,该元素可能是 过滤器 元素代表了CompositeFilter。 这个 过滤器 元素 允许任意数量的 滤波器 元素内配置它。 下面的例子 显示多个过滤器可以被配置在ConsoleAppender。

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <configuration status=”debug” name=”XMLConfigTest” packages=”org.apache.logging.log4j.test”>
  3. <properties>
  4. <property name=”filename”>target/test.log</property>
  5. </properties>
  6. <ThresholdFilter level=”trace”/>
  7. <appenders>
  8. <Console name=”STDOUT”>
  9. <PatternLayout pattern=”%m MDC%X%n”/>
  10. </Console>
  11. <Console name=”FLOW”>
  12. <!– this pattern outputs class name and line number –>
  13. <PatternLayout pattern=”%C{1}.%M %m %ex%n”/>
  14. <filters>
  15. <MarkerFilter marker=”FLOW” onMatch=”ACCEPT” onMismatch=”NEUTRAL”/>
  16. <MarkerFilter marker=”EXCEPTION” onMatch=”ACCEPT” onMismatch=”DENY”/>
  17. </filters>
  18. </Console>
  19. <File name=”File” fileName=”${filename}”>
  20. <PatternLayout>
  21. <pattern>%d %p %C{1.} [%t] %m%n</pattern>
  22. </PatternLayout>
  23. </File>
  24. <List name=”List”>
  25. </List>
  26. </appenders>
  27. <loggers>
  28. <logger name=”org.apache.logging.log4j.test1″ level=”debug” additivity=”false”>
  29. <ThreadContextMapFilter>
  30. <KeyValuePair key=”test” value=”123″/>
  31. </ThreadContextMapFilter>
  32. <appender-ref ref=”STDOUT”/>
  33. </logger>>
  34. <logger name=”org.apache.logging.log4j.test2″ level=”debug” additivity=”false”>
  35. <property name=”user”>${sys:user.name}</property>
  36. <appender-ref ref=”File”>
  37. <ThreadContextMapFilter>
  38. <KeyValuePair key=”test” value=”123″/>
  39. </ThreadContextMapFilter>
  40. </appender-ref>
  41. <appender-ref ref=”STDOUT” level=”error”/>
  42. </logger>>
  43. <root level=”trace”>
  44. <appender-ref ref=”List”/>
  45. </root>
  46. </loggers>
  47. </configuration>

产权置换

Log4j 2支持能够指定标记在配置属性定义的引用 在其他地方。 这些属性将解决当配置文件解释而 其他人可能被传递给组件,它们会在运行时执行。 为此,Log4j 使用Apache Commons Lang的变化 StrSubstitutor 和 StrLookup 类。 在某种程度上类似Ant或Maven,这允许变量声明为 $ {名称} 解决使用属性中声明的配置本身。 例如,下面的例子 显示文件名来滚动文件被声明为一个产权appender。

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <configuration status=”debug” name=”RoutingTest” packages=”org.apache.logging.log4j.test”>
  3. <properties>
  4. <property name=”filename”>target/rolling1/rollingtest-$${sd:type}.log</property>
  5. </properties>
  6. <ThresholdFilter level=”debug”/>
  7. <appenders>
  8. <Console name=”STDOUT”>
  9. <PatternLayout pattern=”%m%n”/>
  10. </Console>
  11. <List name=”List”>
  12. <ThresholdFilter level=”debug”/>
  13. </List>
  14. <Routing name=”Routing”>
  15. <Routes pattern=”$${sd:type}”>
  16. <Route>
  17. <RollingFile name=”Rolling-${sd:type}” fileName=”${filename}”
  18. filePattern=”target/rolling1/test1-${sd:type}.%i.log.gz”>
  19. <PatternLayout>
  20. <pattern>%d %p %c{1.} [%t] %m%n</pattern>
  21. </PatternLayout>
  22. <SizeBasedTriggeringPolicy size=”500″ />
  23. </RollingFile>
  24. </Route>
  25. <Route appender-ref=”STDOUT” key=”Audit”/>
  26. <Route appender-ref=”List” key=”Service”/>
  27. </Routes>
  28. </Routing>
  29. </appenders>
  30. <loggers>
  31. <logger name=”EventLogger” level=”info” additivity=”false”>
  32. <appender-ref ref=”Routing”/>
  33. </logger>
  34. <root level=”error”>
  35. <appender-ref ref=”STDOUT”/>
  36. </root>
  37. </loggers>
  38. </configuration>

虽然这是有用的,有很多地方可以源自属性。 来适应这个, Log4j还支持语法 $ {前缀:名称} 在前缀标识告诉Log4j吗 该变量的名字应该被评估在一个特定的上下文。 语境的构建在Logj4 是:

前缀上下文
CTX线程上下文映射(MDC)
日期插入当前日期和/或时间使用指定的格式
ENV系统环境变量
地图一个值从一个MapMessage
SD一个值从一个StructuredDataMessage。 关键的“id”将返回StructuredDataId的名称 没有企业数量。 关键的“类型”将返回消息类型。 其他键将 从地图上获取单个元素。
sys系统属性

一个默认的属性映射可以在配置文件中声明。 如果该值不能位于 指定的查找的值将使用默认属性映射。 默认的映射是 预先填充了一个值为“主机”,是当前系统的主机名或ip地址和 “contextName”的价值是当前日志上下文。

一个有趣的特性StrLookup处理是,当一个变量声明为引用 多个领先’ $ ‘字符每次变量是解决领导’ $ ‘只是删除。 在前面的例子中,“路线”元素能够解决在运行时变量。 允许 这个前缀值被指定为一个变量与两大’ $ ‘字符。 当配置 文件是第一次加工第一个变量是简单地删除。 因此,当线路元计算 在运行时它是变量声明” $ { sd:type }”导致事件是检查一个 StructuredDataMessage和是否呈现类型属性的值作为路由关键。 并不是所有的元素支持在运行时解析变量。 组件将专门叫 在他们的文档。

如果没有值是发现钥匙在查找相关的前缀然后与之关联的值 在属性声明的关键在配置文件将被使用。 如果没有值是发现 变量声明返回值。 默认值可以被声明在配置 通过做:

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <configuration>
  3. <properties>
  4. <property name=”type”>Audit</property>
  5. </properties>
  6. </configuration>

作为一个脚注,值得指出的是,RollingFile appender中的变量声明 也无法评估,当配置处理。 这只是因为这项决议 整个RollingFile元素是推迟到匹配。 看到RoutingAppender 为更多的信息。

状态信息

就像它是可取的能够诊断应用问题,它通常是必要的 能够诊断问题的日志配置或在配置的组件。 因为 日志没有配置,“正常的”日志不能初始化期间使用。 此外, 正常的日志输出源可以创造无限递归Log4j将检测并引起 递归事件被忽略。 为了适应这种需要,Log4j 2 API包括一个 StatusLogger 。 组件的一个实例StatusLogger声明类似于:

protected final static Logger logger = StatusLogger.getLogger();

因为StatusLogger实现Log4j 2 API的日志界面,所有正常的记录器的方法可能 被使用。

当配置Log4j有时候需要查看生成的状态的事件。 这可以 完成了通过添加状态属性来配置元素或一个默认值 提供了通过设置“Log4jDefaultStatusLevel“系统属性。 以下 配置有状态属性设置为调试。

  1. <?xml version=”1.0″ encoding=”UTF-8″?>;
  2. <configuration status=”debug” name=”RoutingTest”
  3. packages=”org.apache.logging.log4j.test”>
  4. <properties>
  5. <property name=”filename”>target/rolling1/rollingtest-$${sd:type}.log</property>
  6. </properties>
  7. <ThresholdFilter level=”debug”/>
  8. <appenders>
  9. <Console name=”STDOUT”>
  10. <PatternLayout pattern=”%m%n”/>
  11. </Console>
  12. <List name=”List”>
  13. <ThresholdFilter level=”debug”/>
  14. </List>
  15. <Routing name=”Routing”>
  16. <Routes pattern=”$${sd:type}”>
  17. <Route>
  18. <RollingFile name=”Rolling-${sd:type}” fileName=”${filename}”
  19. filePattern=”target/rolling1/test1-${sd:type}.%i.log.gz”>
  20. <PatternLayout>
  21. <pattern>%d %p %c{1.} [%t] %m%n</pattern>
  22. </PatternLayout>
  23. <SizeBasedTriggeringPolicy size=”500″ />
  24. </RollingFile>
  25. </Route>
  26. <Route appender-ref=”STDOUT” key=”Audit”/>
  27. <Route appender-ref=”List” key=”Service”/>
  28. </Routes>
  29. </Routing>
  30. </appenders>
  31. <loggers>
  32. <logger name=”EventLogger” level=”info” additivity=”false”>
  33. <appender-ref ref=”Routing”/>
  34. </logger>
  35. <root level=”error”>
  36. <appender-ref ref=”STDOUT”/>
  37. </root>
  38. </loggers>
  39. </configuration>

在启动这个配置产生:

-11-23 17:08:00,769 DEBUG Generated plugins in 0.003374000 seconds-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="target/rolling1/rollingtest-${sd:type}.log")-11-23 17:08:00,792 DEBUG Calling configureSubstitutor on class org.apache.logging.log4j.core.config.plugins.PropertiesPlugin for element properties with params(properties={filename=target/rolling1/rollingtest-${sd:type}.log})-11-23 17:08:00,794 DEBUG Generated plugins in 0.001362000 seconds-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")-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")-11-23 17:08:00,802 DEBUG Generated plugins in 0.001349000 seconds-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", suppressExceptions="null")-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")-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))-11-23 17:08:00,813 DEBUG Calling createRoute on class org.apache.logging.log4j.core.appender.routing.Route for element Route with params(appender-ref="null", key="null", Node=Route)-11-23 17:08:00,823 DEBUG Calling createRoute on class org.apache.logging.log4j.core.appender.routing.Route for element Route with params(appender-ref="STDOUT", key="Audit", Node=Route)-11-23 17:08:00,824 DEBUG Calling createRoute on class org.apache.logging.log4j.core.appender.routing.Route for element Route with params(appender-ref="List", key="Service", Node=Route)-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')})-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", suppressExceptions="null", Routes({Route(type=dynamic default),Route(type=static Reference=STDOUT key='Audit'),Route(type=static Reference=List key='Service')}), Configuration(RoutingTest), null, null)-11-23 17:08:00,827 DEBUG Calling createAppenders on class org.apache.logging.log4j.core.config.plugins.AppendersPlugin for element appenders with params(appenders={STDOUT, List, Routing})-11-23 17:08:00,828 DEBUG Calling createAppenderRef on class org.apache.logging.log4j.core.config.plugins.AppenderRefPlugin for element appender-ref with params(ref="Routing")-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", appender-ref={Routing}, null)-11-23 17:08:00,830 DEBUG Calling createAppenderRef on class org.apache.logging.log4j.core.config.plugins.AppenderRefPlugin for element appender-ref with params(ref="STDOUT")-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", appender-ref={STDOUT}, null)-11-23 17:08:00,833 DEBUG Calling createLoggers on class org.apache.logging.log4j.core.config.plugins.LoggersPlugin for element loggers with params(loggers={EventLogger, root})-11-23 17:08:00,834 DEBUG Reconfiguration completed-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")-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")-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, suppressExceptions="null")-11-23 17:08:00,858 DEBUG Generated plugins in 0.002014000 seconds-11-23 17:08:00,889 DEBUG Reconfiguration started for context sun.misc.Launcher$AppClassLoader@37b90b39-11-23 17:08:00,890 DEBUG Generated plugins in 0.001355000 seconds-11-23 17:08:00,959 DEBUG Generated plugins in 0.001239000 seconds-11-23 17:08:00,961 DEBUG Generated plugins in 0.001197000 seconds-11-23 17:08:00,965 WARN No Loggers were configured, using default-11-23 17:08:00,976 DEBUG Reconfiguration completed

如果状态属性设置为错误比只有错误消息将被写入控制台。 这 使故障排除可能配置错误。 作为一个例子,如果上面的配置更改 有状态设置为错误和日志记录器宣言是:

  1. <logger name=”EventLogger” level=”info” additivity=”false”>
  2. <appender-ref ref=”Routng”/>
  3. </logger>

以下错误消息将被生产。

  1. 2011-11-24 23:21:25,517 ERROR Unable to locate appender Routng for logger EventLogger

应用程序可能希望直接状态输出一些其他目的地。 可以实现这 通过设置dest属性,要么“犯错”发送到stderr输出或文件位置或URL。 这也可以通过确保配置的状态设置为关闭,然后配置应用程序 以编程方式如:

  1. StatusConsoleListener listener = new StatusConsoleListener(Level.ERROR);
  2. ((StatusLogger) logger).registerListener(listener);

测试在Maven

Maven可以运行单元测试和功能测试在构建循环。 默认情况下,任何文件放置在 src /测试/资源 被自动复制到目标/测试类和被包括在内 在类路径中执行任何测试期间。 因此,log4j2-test放置。 xml到这个目录 会导致一个log4j2用来代替。 xml或log4j2。 json,可能存在。 因此不同的 日志配置可以测试期间使用的比什么是用于生产。

第二种方法,这是广泛使用Log4j,2,是设置Log4j。 configurationFile财产 在注释的方法与@BeforeClass在junit测试类。 这将允许任意 指定的文件中会用到的测试。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
log4j的2.6.2版本properties配置文件的使用举例
在struts里应用log4j写日志
log4j xml 配置
日志Log4j使用
Log4j配置备忘及tomcat5.5日志配制方法
Log4j相对路径以及打印Hibernate的SQL和HQL记录_婲间梦居--朦胧的蓝色梦...
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服