如何覆盖 Maven 插件的 log4j 配置?

Posted

技术标签:

【中文标题】如何覆盖 Maven 插件的 log4j 配置?【英文标题】:How do I override a Maven Plugin's log4j Configuration? 【发布时间】:2011-05-30 02:11:22 【问题描述】:

我正在使用 Cargo Maven 插件将 WAR 部署到远程服务器,但我遇到了问题。我可能会为这个问题创建第二个问题,但这个问题是关于覆盖 Maven 插件的 log4j 配置的。 Cargo 使用 JBoss 的客户端库将内容发送到 JBoss 服务器(我正在尝试这样做)。JBoss 库使用 log4j。 Cargo 没有设置我所知道的任何类型的映射层

因此,本质上,日志消息发生在 Maven 插件的依赖库中。我尝试设置 -Dlog4j.debug 并得到以下信息:

log4j: Trying to find [log4j.xml] using ClassRealm[plugin>org.codehaus.cargo:cargo-maven2-plugin:1.0.5, parent: ClassRealm[maven.api, parent: null]] class loader.
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource().
log4j: Trying to find [log4j.properties] using context classloader ClassRealm[plugin>org.codehaus.cargo:cargo-maven2-plugin:1.0.5, parent: ClassRealm[maven.api, parent: null]].
log4j: Using URL [jar:file:/C:/Users/username/.m2/repository/org/jboss/jbossts/jbossjts/4.13.1.Final/jbossjts-4.13.1.Final.jar!/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL jar:file:/C:/Users/username/.m2/repository/org/jboss/jbossts/jbossjts/4.13.1.Final/jbossjts-4.13.1.Final.jar!/log4j.properties
log4j: Could not find root logger information. Is this OK?
log4j: Parsing for [com.arjuna] with value=[INFO, default, stdout].
log4j: Level token is [INFO].
log4j: Category com.arjuna set to INFO
log4j: Parsing appender named "default".
log4j: Parsing layout options for "default".
log4j: Setting property [conversionPattern] to [%d [%t] %-5p %c - %m%n].
log4j: End of parsing for "default".
log4j: Setting property [maxBackupIndex] to [2].
log4j: Setting property [file] to [transaction.log].
log4j: Setting property [maxFileSize] to [500KB].
log4j: setFile called: transaction.log, true
log4j: setFile ended
log4j: Parsed "default" options.
log4j: Parsing appender named "stdout".
log4j: Parsing layout options for "stdout".
log4j: Setting property [conversionPattern] to [%d [%t] %-5p %c - %m%n].
log4j: End of parsing for "stdout".
log4j: Setting property [threshold] to [WARN].
log4j: Parsed "stdout" options.
log4j: Handling log4j.additivity.com.arjuna=[null]
log4j: Finished configuring.
log4j:WARN No appenders could be found for logger (org.jnp.interfaces.TimedSocketFactory).
log4j:WARN Please initialize the log4j system properly.

然后我尝试设置 -Dlog4j.configuration=mylog4j.properties 但得到了这个:

log4j: Trying to find [mylog4j.properties] using context classloader ClassRealm[plugin>org.codehaus.cargo:cargo-maven2-plugin:1.0.5, parent: ClassRealm[maven.api, parent: null]].
log4j: Trying to find [mylog4j.properties] using ClassRealm[plugin>org.codehaus.cargo:cargo-maven2-plugin:1.0.5, parent: ClassRealm[maven.api, parent: null]] class loader.
log4j: Trying to find [mylog4j.properties] using ClassLoader.getSystemResource().
log4j: Could not find resource: [mylog4j.properties].
log4j:WARN No appenders could be found for logger (org.jnp.interfaces.TimedSocketFactory).
log4j:WARN Please initialize the log4j system properly.

看起来 log4j 配置文件需要在 Maven plugin 的类路径中,但我不知道如何在其中包含随机文件,只包含依赖项。我真的很想设置这些信息,以便我可以从 JBoss 库中获取调试信息,以便解决我的问题。

【问题讨论】:

问题的扩展堆栈跟踪确实帮助我确定异常是在哪里生成的(我正在慢慢解决它。)不过,它似乎可能是有用的信息知道如何做这个覆盖,如果它甚至可能的话。 【参考方案1】:

使用log4j.configuration,您将设置一个资源字符串。查看 log4j default initialization process 和示例。

如果你使用这样的语法

-Dlog4j.configuration=mylog4j.properties

该文件应在类路径中。但是你也可以使用这样的语法

-Dlog4j.configuration=file:/<path>/mylog4j.properties

指定一个完全限定的文件位置。

【讨论】:

谢谢。有没有办法在不向 Maven 命令行添加任何内容的情况下做到这一点?即将文件位置配置为插件的类路径? @nat k log4j 默认查看类路径以查找配置文件 (Default Initialization),因此将配置文件放入 src/main/resources 就足够了。如果它与其他文件冲突,您应该设置log4j.configuration 属性。在 pom.xml 中应该可以做到这一点,因此您不需要命令行。 谢谢。我也这么认为,但是使用我正在使用的插件(maven-docbkx-plugin),log4j 配置文件没有从 src/main/resources 中获取。我最终使用了 maven-set-properties 插件来设置 log4j.configuration 变量。

以上是关于如何覆盖 Maven 插件的 log4j 配置?的主要内容,如果未能解决你的问题,请参考以下文章

Maven工程配置代码覆盖工具Jacoco

如何配置maven以在不同环境中使用不同的log4j.properties文件

maven+SSM+shiro+junit+jetty+log4j环境配置的最佳实践

如何抑制 maven 程序集插件跳过已添加的文件?还是允许覆盖?

Maven 配置文件插件

maven如何配置