【发布时间】: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