【问题标题】:How to configure Log4j with IntelliJ and Gradle如何使用 IntelliJ 和 Gradle 配置 Log4j
【发布时间】:2020-09-10 02:26:53
【问题描述】:

我一定是在做一些愚蠢的事情,但我找不到。我正在尝试将 Log4j 添加到我的项目中,但它没有读取属性文件。我创建了一个最小的可行示例项目。在 IntelliJ 中,我创建了一个新的 gradle 项目。我添加了 log4j 并添加了一个主类。

这是项目结构。

.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── Main.java
    │   └── resources
    │       └── log4j.properties
    └── test
        ├── java
        └── resources

build.gradle

plugins {
    id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.13.3'
}

log4j.properties

log4j.rootLogger=TRACE

Main.java

import org.apache.logging.log4j.LogManager;

public class Main {
    public static void main(String[] args) {
        System.out.println("Print");
        System.out.println("Root Logger Level: " + LogManager.getRootLogger().getLevel());
    }
}

当我运行它时,输出显示根记录器的级别是“错误”,即使我将它设置为跟踪。当然这意味着任何低于错误级别的日志语句都不会被打印出来。

Print
Root Logger Level: ERROR

我阅读的每篇文档都说属性文件需要位于类路径上的目录中,这是有道理的。根据 gradle 文档和我自己的调查,资源目录位于类路径上。实验上,我尝试将文件放置在层次结构的每个级别,没有区别。我看不出找不到属性文件的任何原因。

我尝试通过将 -Dlog4j.configuration=<full/path/to/properties> 添加到 VM 参数来直接指定它。这仍然不起作用,但 gradle 给了我以下输出:

BUILD SUCCESSFUL in 748ms
3 actionable tasks: 1 executed, 2 up-to-date
ERROR StatusLogger Reconfiguration failed: No configuration found for '2a139a55' at 'null' in 'null'
10:23:30 PM: Task execution finished 'Main.main()'.

这似乎发生在程序终止后。我不确定它是否相关。

一定错过了一些愚蠢的东西,但我找不到任何东西。我看了几十个例子,似乎我做的一切都是正确的。我错过了什么?

【问题讨论】:

  • 你能检查一下 IntelliJ 没有排除资源文件夹吗?有时这发生在日食中。在这里你是一个参考:jetbrains.com/help/idea/content-roots.html#adding_content_root
  • @sirandy 似乎并非如此。项目结构将资源列为内容根,尝试添加它会导致错误提示“内容条目不应相交”。此外,属性文件在构建输出中,所以我希望它不会在这里被忽略。
  • 好的,然后尝试将此行添加到您的 gradle 配置文件中。 compile group: 'org.slf4j', name: 'slf4j-api', version: '1.8.0-beta2' compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.11.1' compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.1' Java 的简单日志门面 (SLF4J) 用作各种日志框架(例如 java.util.logging、logback、log4j)的简单门面或抽象,允许最终用户在部署时插入所需的日志框架。
  • 这很有趣,当我添加 SLF4J 记录器时,我收到错误“未找到 SLF4J 提供程序”。但是我可以在错误和致命的情况下使用 Log4j,所以我知道我已经加载了库。我不确定这揭示了什么,但确实是这样。
  • 好的!这是一种警告而不是错误。如果你想关闭它,你应该使用 slf4j 实现。由于您使用的是 log4j,您可以使用 slf4j-log4j12 而不是 org.apache.logging.log4j 这只是一个建议。有关更多信息,请查看此答案:stackoverflow.com/q/54652836/1670134

标签: java gradle log4j


【解决方案1】:

对于原来的问题,因为你正在尝试使用log4j2,所以配置的首选模式是xml文件。可以参考手册:https://logging.apache.org/log4j/2.x/manual/configuration.html

所以要使用版本

System.setProperty(ConfigurationFactory.LOG4J1_CONFIGURATION_FILE_PROPERTY, "src/main/resources/configuration.xml");

【讨论】:

  • 这是迄今为止我得到的最接近的!首先,由于这是log4j2,我想设置ConfigurationFactory.CONFIGURATION_FILE_PROPERTY,而不是你说的。如果我在设置此配置后创建记录器,这将有效,因此它不适用于将记录器作为静态成员的类,这是大多数人所做的。所以现在我知道了这一点,我知道它肯定找不到我的配置文件。出于某种原因,我的类路径上没有任何内容。我得继续调查。
  • 配置文件是指xml配置文件还是.properties文件?
  • 两者都不起作用。我终于解决了!这里的答案帮助了我:stackoverflow.com/a/49893867/3287359 出于某种原因,资源没有被加载,但是将目录删除并重新添加到模块解决了问题!
【解决方案2】:

以下解决方案帮助了我。根据https://logging.apache.org/log4j/2.x/faq.html 上提到的文档,我们必须将 log4jxml 重命名为 log4j2.xml,因为这是新的命名约定,并将其放在 src/main/resources 中。在我的情况下,这个问题在我这样做后就解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多