Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多个模块的maven项目的不同log4j2日志记录级别_Maven_Log4j2_Maven Module - Fatal编程技术网

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

具有多个模块的maven项目的不同log4j2日志记录级别,maven,log4j2,maven-module,Maven,Log4j2,Maven Module,我有一个Maven项目,有几个不同的模块(一个核心模块和一些处理各种功能的其他模块),我希望使用log4j2为这些模块设置不同的日志级别(例如:对于核心模块,我希望有详细的日志(调试),但对于其他模块,我希望保留最少的日志集(信息)) 以下是项目结构的外观: project +- root +- pom.xml +- module-core | +- pom.xml | +- src | | +- main | | +-

我有一个Maven项目,有几个不同的模块(一个核心模块和一些处理各种功能的其他模块),我希望使用log4j2为这些模块设置不同的日志级别(例如:对于核心模块,我希望有详细的日志(调试),但对于其他模块,我希望保留最少的日志集(信息))

以下是项目结构的外观:

  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
放在resources文件夹下的
module core

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

以下是log4j2.xml内容:

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


org.openqa、org.apache.maven、sun.reflect、java.lang.reflect、java.utils、org.testng
%突出显示{-5p |%d{HH:mm:ss}}(%F:%L)%highlight{M}%M%n%xEx{filters(${filters})}

问题在于
Root-level=“INFO”
覆盖模块核心的记录器部分,并在整个项目中持续显示信息日志

是否有一种方法可以忽略根级别部分并强制log4j2仅在模块中显示所需部分的日志


谢谢

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

因此,不清楚你到底想要实现什么

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

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

  • 打算部署在服务器上的应用程序(通常是WAR、EAR、spring引导应用程序等)
  • 供项目应用程序内部使用的库,或应可公开访问的库(如log4j本身、hibernate、spring等)
通常,只有第一类工件具有日志定义(log4j2.xml,随便什么)。 库虽然能够使用日志框架,但没有自己的定义,因为只有使用库的应用程序“知道”如何“服务”日志(附加器、要应用的模式等等)

现在,将这些知识应用到您的问题中: 我假设模块核心是一个库,但模块a和模块b是应用程序

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

说到这里,maven在构建过程中运行测试,这实际上是在构建过程中看到maven运行代码的唯一地方

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


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

非常感谢您的详细回答,我将在项目中的每个maven模块中添加单独的log4j2.xml文件,以便从中自定义设置。另一个很好的解释是:
<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>