将WildFly所有日志重定向至应用配置的Log4j2或统一日志管理器
问题背景
我正在将一个基于PrimeFaces 8、依赖Apache与Weld的旧Web应用(war包)迁移至Jakarta EE 10、PrimeFaces 13.0.4及WildFly 31.0.1.Final环境。迁移已完成,所有Bean已更新为新注解,仅需少量接口调整,但日志出现混乱问题。
我已在WEB应用(war包)中成功配置Log4j2,应用日志可写入指定文件,但发现Log4j2日志同时输出至WildFly独立日志及Eclipse控制台中。由于希望仅使用一个日志管理器(而非应用与服务器各一个),我有以下3个问题:
- 是否可绕过或忽略WildFly默认日志管理器,将所有WildFly服务器日志重定向至应用配置的Log4j2?能否通过Java代码或额外XML/属性文件实现?
- 若上述方案不可行,如何使用WildFly默认服务器日志?我尝试使用java.util.logging类,但未在控制台及独立日志文件中输出任何内容。
- 为理清思路:在WildFly中记录应用日志的最佳实践是什么?
日志嵌套示例
WildFly独立日志(控制台及文件)
15:39:34,029 INFO [org.primefaces.webapp.PostConstructApplicationEventListener] (ServerService Thread Pool -- 96) Running on PrimeFaces 13.0.4 15:39:34,344 INFO [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 96) RESTEASY002225: Deploying jakarta.ws.rs.core.Application: class br.com.powerdba.r2.JakartaRestConfiguration$Proxy$_$$_WeldClientProxy 15:39:34,373 INFO [org.wildfly.extension.undertow] (ServerService Thread Pool -- 96) WFLYUT0021: Registered web context: '/r2' for server 'default-server' 15:39:34,416 INFO [org.jboss.as.server] (ServerService Thread Pool -- 45) WFLYSRV0010: Deployed "r2-1.0.0.war" (runtime-name : "r2-1.0.0.war") 15:39:34,457 INFO [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0212: Resuming server 15:39:34,461 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management 15:39:34,461 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990 15:39:34,464 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 31.0.1.Final (WildFly Core 23.0.3.Final) started in 7537ms - Started 463 of 683 services (322 services are lazy, passive or on-demand) - Server configuration file in use: standalone.xml 15:39:35,498 INFO [stdout] (default task-1) [INFO ] 2024-04-18 15:39:35.497 [default task-1] ValidateLoginFilter - uri = /r2/ 15:39:35,500 INFO [stdout] (default task-1) [WARN ] 2024-04-18 15:39:35.500 [default task-1] ValidateLoginFilter - Page needs authenticated users and user is not logged in. Calling Login page. 15:39:35,506 INFO [stdout] (default task-1) [INFO ] 2024-04-18 15:39:35.506 [default task-1] ValidateLoginFilter - uri = /r2/login.xhtml 15:39:35,506 INFO [stdout] (default task-1) [INFO ] 2024-04-18 15:39:35.506 [default task-1] ValidateLoginFilter - Calling doFilter for login page 15:39:35,753 INFO [stdout] (default task-1) [INFO ] 2024-04-18 15:39:35.753 [default task-1] LoginBean - ---/nLoginBean/n---
应用自定义日志文件
[INFO ] 2024-04-18 15:39:35.497 [default task-1] ValidateLoginFilter - uri = /r2/ [WARN ] 2024-04-18 15:39:35.500 [default task-1] ValidateLoginFilter - Page needs authenticated users and user is not logged in. Calling Login page. [INFO ] 2024-04-18 15:39:35.506 [default task-1] ValidateLoginFilter - uri = /r2/login.xhtml [INFO ] 2024-04-18 15:39:35.506 [default task-1] ValidateLoginFilter - Calling doFilter for [INFO ] 2024-04-18 15:39:35.753 [default task-1] LoginBean - ---/nLoginBean/n---
问题解答
1. 绕过WildFly默认日志管理器,统一使用应用Log4j2
可以实现,但需要修改WildFly服务器配置,无法仅通过应用代码或内部配置文件完成:
- 禁用WildFly自带日志子系统:编辑
standalone.xml(或domain.xml),移除或注释掉<subsystem xmlns="urn:jboss:domain:logging:...">整个节点。 - 配置全局日志管理器为Log4j2:在WildFly启动参数中添加:
同时将Log4j2核心jar包(-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManagerlog4j-core.jar、log4j-api.jar、log4j-jul.jar)放入WildFly的modules/system/layers/base/org/apache/logging/log4j/main目录,创建对应的module.xml文件确保服务器启动时加载依赖。 - 注意:此方式会让所有服务器日志和应用日志走同一Log4j2配置,但会丢失WildFly日志子系统的动态级别调整等特性,且WildFly升级时需重新配置模块。
2. 正确使用WildFly默认日志系统
使用java.util.logging无输出大概率是配置冲突或未正确配置:
- 移除应用内日志实现类:删除war包中Log4j2相关jar包,避免与服务器日志系统冲突。
- 配置WildFly日志子系统:在
standalone.xml中为应用包添加专属日志配置,示例:<logger category="br.com.powerdba.r2"> <level name="INFO"/> <handlers> <handler name="CONSOLE"/> <handler name="FILE"/> </handlers> </logger> - 代码中使用标准日志API:
import java.util.logging.Logger; public class ValidateLoginFilter { private static final Logger logger = Logger.getLogger(ValidateLoginFilter.class.getName()); public void doFilter(...) { logger.info("uri = /r2/"); } } - 检查日志级别:确保WildFly全局或应用包的日志级别不高于输出的日志级别(如全局设为WARN时,INFO日志不会输出)。
3. WildFly中应用日志的最佳实践
- 优先使用服务器自带日志子系统:WildFly日志基于
java.util.logging,支持动态级别调整、集中管理,无需应用携带额外日志依赖,减少冲突。 - 隔离应用日志:在WildFly配置中为应用包单独设置日志级别和输出处理器,方便区分服务器与应用日志,甚至单独输出到指定文件。
- 避免打包日志实现类:若需用第三方日志框架(如SLF4J),仅打包日志API,让服务器提供实现(WildFly支持SLF4J桥接至自身日志系统)。
- 统一日志格式:通过WildFly配置统一服务器与应用的日志格式,便于日志分析工具处理。
内容的提问来源于stack exchange,提问作者adamitj
相关产品推荐
相关产品推荐

