具有多个模块的 Maven 项目的不同 log4j2 日志记录级别
Different log4j2 logging levels for maven project with multiple modules
我有一个 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"
覆盖了 module-core 的 Logger 部分,并在所有项目中持续显示 INFO 日志。
有没有办法忽略根级部分并强制 log4j2 仅显示模块中我想要的部分的日志?
谢谢!
Maven 是一个构建工具,而 Log4j 是一个在 运行 时间发挥作用的库。
因此不清楚您要实现的目标。
为了获得 log4j 的正确定义,它的定义(配置)必须出现在工件中,并且 maven "ends" 准备工件时(好的,有 install
和 deploy
但他们只对已经准备好的工件执行 "mechanical" 操作并且不更改它)。
现在神器大致可以分为2种:
- 打算部署在服务器上的应用程序(通常是 WAR、EAR、spring-boot-applications 等)
- 供项目应用程序内部使用的库或应该可公开访问的库(如 log4j 本身、hibernate、spring 等)
通常,只有第一种类型的工件具有日志记录定义(log4j2.xml,随便什么)。
库虽然能够使用日志框架,但没有自己的定义,因为只有使用库的应用程序 "knows" 如何 "serve" 日志(附加程序、要应用的模式等)
现在,将这些知识应用到您的问题中:
我假设 module-core 是一个库,但是 module-a 和 module-b 是应用程序。
如果是这样,他们应该在 运行time 的类路径 中有自己的 log4j2.xml。
通常,人们将配置文件放入这些模块的 src/main/resources
中,然后他们就完成了——每个 log4j2.xml 可以不同。或者,他们从某个 "shared" 位置导入文件,如果目标是在应用程序之间保持相同的 log4j 行为(同样,在 运行 时间内)。
现在说了这么多,maven 运行 在构建期间进行测试,这实际上是您在构建期间实际 实际看到 maven 运行 代码的唯一地方。
maven 中的测试具有不同的类路径,因此如果目标是在测试中建立 log4j 的不同行为,您应该将日志记录配置放入 src/test/resources
。此文件和测试本身都不会打包到生产工件中。
这种做法适用于"libraries"和"applications"
我有一个 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"
覆盖了 module-core 的 Logger 部分,并在所有项目中持续显示 INFO 日志。
有没有办法忽略根级部分并强制 log4j2 仅显示模块中我想要的部分的日志?
谢谢!
Maven 是一个构建工具,而 Log4j 是一个在 运行 时间发挥作用的库。
因此不清楚您要实现的目标。
为了获得 log4j 的正确定义,它的定义(配置)必须出现在工件中,并且 maven "ends" 准备工件时(好的,有 install
和 deploy
但他们只对已经准备好的工件执行 "mechanical" 操作并且不更改它)。
现在神器大致可以分为2种:
- 打算部署在服务器上的应用程序(通常是 WAR、EAR、spring-boot-applications 等)
- 供项目应用程序内部使用的库或应该可公开访问的库(如 log4j 本身、hibernate、spring 等)
通常,只有第一种类型的工件具有日志记录定义(log4j2.xml,随便什么)。 库虽然能够使用日志框架,但没有自己的定义,因为只有使用库的应用程序 "knows" 如何 "serve" 日志(附加程序、要应用的模式等)
现在,将这些知识应用到您的问题中: 我假设 module-core 是一个库,但是 module-a 和 module-b 是应用程序。
如果是这样,他们应该在 运行time 的类路径 中有自己的 log4j2.xml。
通常,人们将配置文件放入这些模块的 src/main/resources
中,然后他们就完成了——每个 log4j2.xml 可以不同。或者,他们从某个 "shared" 位置导入文件,如果目标是在应用程序之间保持相同的 log4j 行为(同样,在 运行 时间内)。
现在说了这么多,maven 运行 在构建期间进行测试,这实际上是您在构建期间实际 实际看到 maven 运行 代码的唯一地方。
maven 中的测试具有不同的类路径,因此如果目标是在测试中建立 log4j 的不同行为,您应该将日志记录配置放入 src/test/resources
。此文件和测试本身都不会打包到生产工件中。
这种做法适用于"libraries"和"applications"