为此Log4J代码设置的级别在哪里?

时间:2015-04-05 17:07:42

标签: java log4j

我有以下Log4J类:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Level;

public class HelloWorldLog4J {

    private static final Logger logger = LogManager.getLogger("HelloWorld");
    // private static final Logger logger = LogManager.getLogger

    public static void main(String[] args) {

        System.out.println("...Before");
        System.out.println();

        logger.info("Hello, this is an INFO message"); 
        logger.warn("Hello, this is an WARN  message");
        logger.fatal("Hello, this is a FATAL  message");
        logger.fatal("Hello, this is a FATAL  message ALSO, #2");
        logger.fatal("Hello, this is a FATAL  message ALSO, #3");
        logger.fatal("Hello, this is a FATAL  message ALSO, #4");
        logger.debug("Hello, this is a FATAL  message");
        logger.info("Hello, this is an INFO message");
        logger.info("Hello, this is an INFO message");
        System.out.println();
        System.out.println("...After");

    }

}

当我运行此代码时,我得到以下输出:

...Before

11:37:38.745 [main] FATAL HelloWorld - Hello, this is a FATAL  message
11:37:38.745 [main] FATAL HelloWorld - Hello, this is a FATAL  message ALSO, #2
11:37:38.745 [main] FATAL HelloWorld - Hello, this is a FATAL  message ALSO, #3
11:37:38.745 [main] FATAL HelloWorld - Hello, this is a FATAL  message ALSO, #4

...After

我一直在寻找确定我的关卡的属性文件(它是log4j.properties或log4j.xml),但我不知道在哪里寻找它。我读过一次它是一个环境变量,不确定它是如何工作的

我认为它可能在java类的目录中(即HelloWorldLog4J),但它不存在。

编辑:我运行我的代码:

C:\Users\Adel\JavaCoding>java -cp C:\apache_log4j_beta5\apache-log4j-2.0-beta5-b
in\log4j-api-2.0-beta5.jar;C:\apache_log4j_beta5\apache-log4j-2.0-beta5-bin\log4
j-core-2.0-beta5.jar;. HelloWorldLog4J

如果根是JAR文件,那么classpath的根目录在哪里?

由于

4 个答案:

答案 0 :(得分:4)

Log4j 2.X按照以下步骤进行自我配置:

  • Log4j将检查log4j.configurationFile系统属性,如果设置,将尝试使用与文件扩展名匹配的ConfigurationFactory加载配置。
  • 如果未设置系统属性,YAML ConfigurationFactory将在类路径中查找log4j2-test.yamllog4j2-test.yml
  • 如果未找到此类文件,JSON ConfigurationFactory将在类路径中查找log4j2-test.jsonlog4j2-test.jsn
  • 如果找不到这样的文件,XML ConfigurationFactory将在类路径中查找log4j2-test.xml
  • 如果找不到测试文件,YAML ConfigurationFactory将在类路径中查找log4j2.yamllog4j2.yml
  • 如果找不到YAML文件,JSON ConfigurationFactory将在类路径中查找log4j2.jsonlog4j2.jsn
  • 如果找不到JSON文件,XML ConfigurationFactory将尝试在类路径上找到log4j2.xml
  • 如果找不到配置文件,将使用DefaultConfiguration。这将导致日志记录输出进入控制台。

使用您当前的配置,您没有任何这些文件,因此Log4j正在使用DefaultConfiguration执行以下代码:

public DefaultConfiguration() {

    setName(DEFAULT_NAME);
    final Layout layout = PatternLayout.createLayout("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n",
        null, null, null);
    final Appender appender = ConsoleAppender.createAppender(layout, null, "SYSTEM_OUT", "Console", "false",
        "true");
    appender.start();
    addAppender(appender);
    final LoggerConfig root = getRootLogger();
    root.addAppender(appender, null, null);

    final String levelName = PropertiesUtil.getProperties().getStringProperty(DEFAULT_LEVEL);
    final Level level = levelName != null && Level.valueOf(levelName) != null ?
        Level.valueOf(levelName) : Level.ERROR;
    root.setLevel(level);
}

因此,您的记录器有一个Console appender,具有ERROR级别(因此它只打印ERROR和FATAL消息)和以下模式:%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

您可以以编程方式配置记录器(例如DefaultConfiguration正在执行)或使用任何配置文件。

您在此页面中有一些示例配置文件:

https://logging.apache.org/log4j/2.x/manual/configuration.html

答案 1 :(得分:2)

一些事情。

  1. 您只获取 ERROR 级别日志,因为默认情况下log4net将根记录器设置为级别 ERROR 。所以基本上你现在没有配置。

      

    请注意,默认情况下,Log4j会将根记录器分配给Level.ERROR。   https://logging.apache.org/log4j/2.x/manual/configuration.html

  2. Log4j2查找 log4j2.xml 。请注意名称

  3. 中的 2
  4. 您是否正在使用具有Maven构建的通用IDE?这很常见,如果是这样,请尝试将log4j2.xml文件添加到 $ {proj} /src/main/resources/log4j2.xml 。这是默认的主“应用程序/库资源”文件夹,并将与大多数Maven JAR版本一起正确部署。 https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

答案 2 :(得分:1)

您可以通过多种方式配置log4j设置。这也取决于您是否使用log4j 1.x或2.x

log4j 2.x版本中有一个非常好的自动配置功能。

1. Log4j will inspect the "log4j.configurationFile" system property and, if set, will 
attempt to load the configuration using the ConfigurationFactory that matches the
file extension.
..
..
7. If a JSON file cannot be located the XML ConfigurationFactory will 
 try to locate log4j2.xml on the classpath .

在上面查找简单的 log4j2.xml https://logging.apache.org/log4j/2.x/manual/configuration.html

答案 3 :(得分:1)

尝试:

BasicConfigurator.configure();
Logger.getRootLogger().setLevel(Level.INFO);

System.out.println("...Before");
//code ...

您可以通过编程方式修改关卡

Logger.getRootLogger().setLevel(Level.TRACE);

请参阅:Set log4j log level