0

我有一个 Maven 项目,其中包含几个不同的模块(一个核心模块和一些其他处理各种功能的模块),我想使用 log4j2 设置不同的日志记录级别(例如:对于核心模块,我想有详细的日志(DEBUG ) 但对于其他人,我想保留最少的日志集 (INFO))。

项目结构如下所示:

  project
 +- root
    +- pom.xml
    +- module-core
    |  +- pom.xml
    |  +- src 
    |  |  +- main
    |  |     +- java
    |  |     +- resources
    |  |  +- test
    |  |     +- java
    |  +- target  
    +- module-A
    |  +- pom.xml
    |  +- src
    |  |  +- main
    |  |     +- java
    |  |  +- test
    |  |     +- java
    |  +- target
    +- module-B
    |  +- pom.xml
    |  +- src
    |  |  +- main
    |  |     +- java
    |  |  +- test
    |  |     +- java
    |  +- target

Log4j2 依赖项放在根 pom.xml 文件中,并log4j2.xml放在module-core资源文件夹下。

是否可以在上述log4j2.xml文件中自定义和指定所需的日志记录级别?

这是 log4j2.xml 内容:

<?xml version="1.0" encoding="UTF-8"?>

<properties>
    <property name="filters">org.openqa,org.apache.maven,sun.reflect,java.lang.reflect,java.utils,org.testng</property>
    <property name="logMsgPattern">%highlight{%-5p | %d{HH:mm:ss} |} (%F:%L) %highlight{| %M ||} %m%n%xEx{filters(${filters})}</property>
</properties>

<Appenders>
    <File name="FILE" fileName="target/logs/logfile.log" append="true">
        <PatternLayout pattern="%-5p | %d{HH:mm:ss} | (%F:%L) | %M - %m%n"/>
    </File>

    <Console name="CONSOLE" target="SYSTEM_OUT">
        <PatternLayout pattern="%highlight{%-5p | %d{HH:mm:ss:fff} |} (%F:%L) %highlight{| %M ||} %m%n%xEx{filters(${filters})}"/>
    </Console>

</Appenders>

<Loggers>

    <Root level="INFO" additivity="false">
        <AppenderRef level="INFO" ref="CONSOLE" />
    </Root>

    <Logger name="module-core.*" level="DEBUG" additivity="false">
        <AppenderRef level="DEBUG" ref="CONSOLE" />
    </Logger>

    <Logger name="module-A.*" level="INFO" additivity="false">
        <AppenderRef level="INFO" ref="CONSOLE" />
    </Logger>

</Loggers>

问题在于,它Root level="INFO"覆盖了模块核心的 Logger 部分,并在所有项目中不断显示 INFO 日志。

有没有办法忽略根级别部分并强制 log4j2 仅显示模块中我想要的部分的日志?

谢谢!

4

1 回答 1

1

Maven 是一个构建工具,而 Log4j 是一个在运行时发挥作用的库。

因此,尚不清楚您到底要达到什么目的。

为了获得 log4j 的正确定义,它的定义(配置)必须出现在工件中,并且当工件准备好时,maven“结束”(好的,有installdeploy他们只是对已经准备好的工件执行“机械”操作并且不要改变它)。

现在神器大致可以分为2种:

  • 打算部署在服务器上的应用程序(通常是 WAR、EAR、spring-boot-applications 等)
  • 供项目应用程序内部使用的库或应该可公开访问的库(如 log4j 本身、hibernate、spring 等)

通常,只有第一种类型的工件具有日志定义(log4j2.xml 等)。库虽然能够使用日志框架,但没有自己的定义,因为只有使用库的应用程序“知道”如何“提供”日志(附加程序、要应用的模式等)

现在,将这些知识应用于您的问题:我假设 module-core 是一个库,但 module-a 和 module-b 是应用程序。

如果是这样,它们应该在运行时的类路径中有自己的 log4j2.xml 。通常,人们将配置文件放入src/main/resources这些模块中就完成了——每个 log4j2.xml 可以不同。或者,如果目标是在应用程序之间保留相同的 log4j 行为(同样,在运行时),他们从某个“共享”位置导入文件。

现在说了这么多,maven 在构建期间运行测试,这实际上是您看到 maven在构建期间实际运行代码的唯一地方。

maven 中的测试具有不同的类路径,因此如果目标是在测试中建立 log4j 的不同行为,您应该将日志配置放入src/test/resources. 此文件和测试本身都不会被打包到生产工件中。

这种做法适用于“库”和“应用程序”

于 2018-09-28T04:53:51.210 回答