【问题标题】:log4j.properties ignored when using mvn exec:java使用 mvn exec:java 时忽略 log4j.properties
【发布时间】:2016-08-05 05:23:48
【问题描述】:

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

我使用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 具有 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 配置工作正常。

【问题讨论】:

    标签: java maven logging log4j slf4j


    【解决方案1】:

    JDK14LoggerAdapter 是 slf4j-jdk14-1.7.21.jar 的一部分。所以我的猜测是你的类路径包含这个 jar。

    由于 mvn exec:java 和 jetty 使用不同的类加载器,你只对 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?

    【讨论】:

    • 试试 mvn dependency:tree,它可能是传递性的
    • 我在META-INF/maven/plugin.xml中的exec-maven-plugin 1.4.0中找到了罪魁祸首slf4j-jdk14,所以问题是,我如何告诉mvn exec:java不要使用slf4j-jdk14
    • 试试 includePluginDependencies=false mojohaus.org/exec-maven-plugin/java-mojo.html
    • 没有帮助(默认为 false)。也许我应该降级exec-maven-plugin,我知道它在升级之前就可以工作
    • 对不起,忽略我之前的评论。在我的 pom.xml 中,这意外设置为 true,因此我的命令行参数被覆盖,我认为它不起作用。现在它起作用了!非常感谢!
    【解决方案2】:

    确保 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。

    【讨论】:

      猜你喜欢
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 2012-12-25
      • 1970-01-01
      相关资源
      最近更新 更多