log4j.properties 使用 mvn exec:java 时被忽略

log4j.properties ignored when using mvn exec:java

我在命令行上使用 mvn exec:java -Dexec.mainClass=my.Class 到 运行。虽然程序是 运行ning,但我有一些调试输出,我想记录下来。

我使用 private static Logger logger = LoggerFactory.getLogger("mylogger"); 来初始化记录器。我在 log4j.properties:

中这样配置
log4j.appender.mylogger=org.apache.log4j.DailyRollingFileAppender
log4j.appender.mylogger.Threshold=DEBUG
log4j.appender.mylogger.File=logs/mylogger.log
log4j.appender.mylogger.DatePattern=.yyyy-MM
log4j.appender.mylogger.layout=org.apache.log4j.PatternLayout
log4j.appender.mylogger.layout.ConversionPattern=%d{ISO8601} [%5p] %C{1}:%L - %m%n
log4j.additivity.mylogger=false

然而,logger 有 class org.slf4j.impl.JDK14LoggerAdapter 并且似乎忽略了 log4j.properties 中的所有设置 - 它正在使用本地化警告和信息记录到 STDERR。

我的相关 Maven 依赖项:

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
  <type>jar</type>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.21</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.21</version>
</dependency>

如何在使用 mvn exec:java 时获取自定义配置的记录器?当 运行 使用 Jetty 连接 Spring 应用程序的其余部分时,我的 log4j.properties 配置工作正常。

JDK14LoggerAdapter 是 slf4j-jdk14-1.7 的一部分。21.jar。所以我猜你的 classpath 包含这个 jar。

由于 mvn exec:java 和 jetty 使用不同的 class 加载器,你很幸运,jetty 更喜欢 slf4j-log4j12 而不是 jdk14 绑定。

此外,请确保 exec:java includePluginDependencies 未设置为 true(默认情况下为 false)http://www.mojohaus.org/exec-maven-plugin/java-mojo.html

如果在删除令人反感的 jar 后,您的命令行仍需要选择 log4.properties 文件。即向控制台输入以下错误:

log4j:WARN No appenders could be found for logger (dao.hsqlmanager).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

您可以提供属性文件的路径传递系统 属性 log4j.configuration 到 mvn exec:java

How to pass systemProperties when invoking exec:java plugin in maven?

确保 includePluginDependencies 在 pom.xml:

中也设置为 false
<configuration>
  <executable>maven</executable>
  <includePluginDependencies>false</includePluginDependencies>
</configuration>

去掉slf4j的依赖-api

<!--
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.21</version>
</dependency>
-->

来自 pom.xml。

如果有效,则调用 mvn exec:java.

时无需添加 -Dlog4j.configuration