配置

自动配置

原文地址

Log4j具有在初始化期间自配置的能力。当Log4j启动时,它将定位所有ConfigurationFactory插件,并按照从从高到低的加权顺序排列它们。交付时,Log4j包含四个ConfigurationFactory实现:一个用于JSON、一个用于YAML、一个用于属性、一个用于XML。

  1. Log4j将检查“log4j.configurationFile”系统属性,如果设置了,将尝试使用与文件扩展名匹配的ConfigurationFactory加载配置。
  2. 如果没有设置系统属性,ConfigurationFactory的属性将在类路径中查找log4j2-test.properties文件。
  3. 如果没有找到这样的文件,YAML ConfigurationFactory将在类路径中查找log4j2-test.yaml或log4j2-test.yml文件。
  4. 如果没有找到这样的文件,JSON ConfigurationFactory将在类路径中查找log4j2-test.json或log4j2-test.jsn文件。
  5. 如果没有找到这样的文件,XML ConfigurationFactory将在类路径中查找log4j2-test.xml文件。
  6. 如果无法找到测试文件,则ConfigurationFactory的属性将在类路径上查找log4j2.properties文件。
  7. 如果无法找到属性文件,YAML ConfigurationFactory将在类路径中查找log4j2.yaml或log4j2.yml文件。
  8. 如果无法找到YAML文件,JSON ConfigurationFactory将在类路径上查找log4j2.json或log4j2.jsn文件。
  9. 如果找不到JSON文件,XML ConfigurationFactory将尝试在类路径上找到log4j2.xml文件。
  10. 如果没有找到配置文件,将使用DefaultConfiguration。这将导致日志输出到控制台。

一个名为MyApp的示例应用将展示Log4j是如何做到这些的。

import com.foo.Bar;

// 导入Log4j的类
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

public class MyApp {

    // 定义一个静态的日志器变量,引用名为MyApp的实例
    private static final Logger logger = LogManager.getLogger(MyApp.class);

    public static void main(final String... args) {

        // 设置一个简单的配置,日志显示在控制台中

        logger.trace("Entering application.");
        Bar bar = new Bar();
        if (!bar.doIt()) {
            logger.error("Didn't do it.");
        }
        logger.trace("Exiting application.");
    }
}

MyAppu别没导入Log4j相关的类。然后它定义一个名为MyApp的静态Logger变量,这恰好是类的完全限定名。

MyApp使用com.foo包中定义的Bar类。

package com.foo;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

public class Bar {
  static final Logger logger = LogManager.getLogger(Bar.class.getName());

  public boolean doIt() {
    logger.entry();
    logger.error("Did it again!");
    return logger.exit(false);
  }
}

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

  • 一个附加到根记录器的ConsoleAppender
  • 一个设置为“%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n”的PatternLayout,被附加到ConsoleAppender上。

注意,默认情况下Log4j将根日志记录器分配给Level.ERROR

MyApp的输出类似如下:

17:13:01.540 [main] ERROR com.foo.Bar - Did it again!
17:13:01.540 [main] ERROR MyApp - Didn't do it.

如前所述,Log4j将首先尝试从配置文件配置自身。与默认配置相同的配置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

一旦上述文件作为log4j2.xml放入到类路径中,你将得到与上面列出的相同结果。将根级别更改为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.

请注意,使用默认配置时,将禁用状态日志的记录。

results matching ""

    No results matching ""