具有多个模块的Maven项目的不同log4j2日志记录级别

时间:2018-09-27 13:24:53

标签: maven log4j2 maven-module

我有一个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仅在模块内显示我所需部分的日志?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

因此,您不清楚要达到的目标。

为了获得正确的log4j定义,必须在工件中显示其定义(配置),并且在准备工件时maven“结束”(好的,有installdeploy,他们只是对已经准备好的工件进行“机械”操作,而不会对其进行更改。

现在的工件可以大致分为两种类型:

  • 打算在服务器上部署的应用程序(通常是WAR,EAR,spring-boot-applications等)
  • 打算由项目的应用程序内部使用的库或应该公开访问的库(例如log4j本身,休眠,春季等)

通常,只有第一类工件才具有日志记录定义(log4j2.xml,无论如何)。 能够使用日志记录框架的库没有它们自己的定义,因为只有使用该库的应用程序才能“知道”如何“提供”日志(附加程序,要应用的模式等)

现在,将此知识应用于您的问题: 我认为module-core是一个库,而module-a和module-b是应用程序。

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

现在,话已经说完了,maven在构建期间运行测试,而这实际上是您看到maven在构建期间实际上运行代码的唯一地方

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

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