JBoss/ Wildfly AS 内部重复格式化的记录器输出
Duplicately formatted logger output inside inside JBoss/ Wildfly AS
看来,我不能排除 JBoss/ Wildfly 日志子系统。
我有一个 Java EE 耳朵,想将 slf4j API 与 log4J2 实现一起使用。
我的意图是禁用 JBoss 日志记录子系统,让我的 slf4j log4j2 实现处理日志记录。但我仍然重复处理标准输出:
12:55:00,820 INFO [stdout] (Thread-316) 12:55:00 INFO
耳朵结构如下:
d----- 03.07.2020 12:53 lib
d----- 03.07.2020 12:53 META-INF
-a---- 03.07.2020 12:53 13238 org.example-helloworld-ejb-1.0-SNAPSHOT.jar
-a---- 03.07.2020 12:53 3598717 org.example-helloworld-web-1.0-SNAPSHOT.war
lib目录:
-a---- 03.07.2020 12:53 26586 javax.annotation-javax.annotation-api-1.3.2.jar
-a---- 03.07.2020 12:53 63679 javax.ejb-javax.ejb-api-3.2.2.jar
-a---- 03.07.2020 12:53 28016 javax.transaction-javax.transaction-api-1.3.jar
-a---- 03.07.2020 12:53 126898 javax.ws.rs-javax.ws.rs-api-2.1.1.jar
-a---- 03.07.2020 12:53 292301 org.apache.logging.log4j-log4j-api-2.13.3.jar
-a---- 03.07.2020 12:53 1714164 org.apache.logging.log4j-log4j-core-2.13.3.jar
-a---- 03.07.2020 12:53 23590 org.apache.logging.log4j-log4j-slf4j-impl-2.13.3.jar
-a---- 03.07.2020 12:53 1526 org.example-helloworld-config-1.0-SNAPSHOT.jar
-a---- 03.07.2020 12:53 6071 org.example-helloworld-model-1.0-SNAPSHOT.jar
-a---- 03.07.2020 12:53 41203 org.slf4j-slf4j-api-1.7.25.jar
META-INF目录:
-a---- 03.07.2020 12:53 470 jboss-deployment-structure.xml
jboss-deployment-structure.xml
的内容:
<jboss-deployment-structure
xmlns="urn:jboss:deployment-structure:1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<deployment>
<dependencies>
<module name="config"/>
</dependencies>
<exclude-subsystems>
<subsystem name="logging" />
</exclude-subsystems>
</deployment>
</jboss-deployment-structure>
另外我修改了standalone.xml
:
[..]
<profile>
<subsystem xmlns="urn:jboss:domain:logging:8.0">
<add-logging-api-dependencies value="false"/>
<console-handler name="CONSOLE">
<formatter>
[..]
我的log4j2.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="3" status="INFO">
<Appenders>
<Console name="Console1" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{1.}} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="all">
<AppenderRef ref="Console1"/>
</Root>
</Loggers>
</Configuration>
注意: 我还尝试使用 logback 作为日志记录实现。这 也 产生重复格式的输出到标准输出。#
非常感谢任何解决/变通方法的提示!
如果您想在使用 slf4j 的部署中使用 log4j-core,即 log4j2 日志管理器实现,您需要在部署中包含您似乎正在执行的正确依赖项。
然后您需要告诉 WildFly 不要将日志记录依赖项添加到您的部署中。以下选项将排除将日志记录依赖项添加到您的部署中
- 使用
jboss-deployment-structure.xml
排除日志子系统
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<exclude-subsystems>
<subsystem name="logging"/>
</exclude-subsystems>
</deployment>
</jboss-deployment-structure>
- 将
add-logging-api-dependencies
属性更改为 false
。请注意,这会影响所有部署。
/subsystem=logging:write-attribute(name=add-logging-api-dependencies, value=false)
- 使用
jboss-deployment-structure.xml
排除每个日志记录模块。不过,选项 1 比这容易得多。
重复输出的原因是 WildFly 在记录器中包装了 System.out
和 System.err
,记录器名称分别为 stdout
和 stderr
。要解决此问题,您需要添加新的格式化程序、控制台处理程序和记录器以删除默认的控制台处理程序格式。
/subsystem=logging/pattern-formatter=stdout:add(pattern="%s%n")
/subsystem=logging/console-handler=stdout:add(named-formatter=stdout, autoflush=true, target=System.out)
/subsystem=logging/logger=stdout:add(use-parent-handlers=false, handlers=[stdout])
看来,我不能排除 JBoss/ Wildfly 日志子系统。
我有一个 Java EE 耳朵,想将 slf4j API 与 log4J2 实现一起使用。
我的意图是禁用 JBoss 日志记录子系统,让我的 slf4j log4j2 实现处理日志记录。但我仍然重复处理标准输出:
12:55:00,820 INFO [stdout] (Thread-316) 12:55:00 INFO
耳朵结构如下:
d----- 03.07.2020 12:53 lib
d----- 03.07.2020 12:53 META-INF
-a---- 03.07.2020 12:53 13238 org.example-helloworld-ejb-1.0-SNAPSHOT.jar
-a---- 03.07.2020 12:53 3598717 org.example-helloworld-web-1.0-SNAPSHOT.war
lib目录:
-a---- 03.07.2020 12:53 26586 javax.annotation-javax.annotation-api-1.3.2.jar
-a---- 03.07.2020 12:53 63679 javax.ejb-javax.ejb-api-3.2.2.jar
-a---- 03.07.2020 12:53 28016 javax.transaction-javax.transaction-api-1.3.jar
-a---- 03.07.2020 12:53 126898 javax.ws.rs-javax.ws.rs-api-2.1.1.jar
-a---- 03.07.2020 12:53 292301 org.apache.logging.log4j-log4j-api-2.13.3.jar
-a---- 03.07.2020 12:53 1714164 org.apache.logging.log4j-log4j-core-2.13.3.jar
-a---- 03.07.2020 12:53 23590 org.apache.logging.log4j-log4j-slf4j-impl-2.13.3.jar
-a---- 03.07.2020 12:53 1526 org.example-helloworld-config-1.0-SNAPSHOT.jar
-a---- 03.07.2020 12:53 6071 org.example-helloworld-model-1.0-SNAPSHOT.jar
-a---- 03.07.2020 12:53 41203 org.slf4j-slf4j-api-1.7.25.jar
META-INF目录:
-a---- 03.07.2020 12:53 470 jboss-deployment-structure.xml
jboss-deployment-structure.xml
的内容:
<jboss-deployment-structure
xmlns="urn:jboss:deployment-structure:1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<deployment>
<dependencies>
<module name="config"/>
</dependencies>
<exclude-subsystems>
<subsystem name="logging" />
</exclude-subsystems>
</deployment>
</jboss-deployment-structure>
另外我修改了standalone.xml
:
[..]
<profile>
<subsystem xmlns="urn:jboss:domain:logging:8.0">
<add-logging-api-dependencies value="false"/>
<console-handler name="CONSOLE">
<formatter>
[..]
我的log4j2.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="3" status="INFO">
<Appenders>
<Console name="Console1" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{1.}} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="all">
<AppenderRef ref="Console1"/>
</Root>
</Loggers>
</Configuration>
注意: 我还尝试使用 logback 作为日志记录实现。这 也 产生重复格式的输出到标准输出。#
非常感谢任何解决/变通方法的提示!
如果您想在使用 slf4j 的部署中使用 log4j-core,即 log4j2 日志管理器实现,您需要在部署中包含您似乎正在执行的正确依赖项。
然后您需要告诉 WildFly 不要将日志记录依赖项添加到您的部署中。以下选项将排除将日志记录依赖项添加到您的部署中
- 使用
jboss-deployment-structure.xml
排除日志子系统
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<exclude-subsystems>
<subsystem name="logging"/>
</exclude-subsystems>
</deployment>
</jboss-deployment-structure>
- 将
add-logging-api-dependencies
属性更改为false
。请注意,这会影响所有部署。
/subsystem=logging:write-attribute(name=add-logging-api-dependencies, value=false)
- 使用
jboss-deployment-structure.xml
排除每个日志记录模块。不过,选项 1 比这容易得多。
重复输出的原因是 WildFly 在记录器中包装了 System.out
和 System.err
,记录器名称分别为 stdout
和 stderr
。要解决此问题,您需要添加新的格式化程序、控制台处理程序和记录器以删除默认的控制台处理程序格式。
/subsystem=logging/pattern-formatter=stdout:add(pattern="%s%n")
/subsystem=logging/console-handler=stdout:add(named-formatter=stdout, autoflush=true, target=System.out)
/subsystem=logging/logger=stdout:add(use-parent-handlers=false, handlers=[stdout])