You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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个问题:

  1. 是否可绕过或忽略WildFly默认日志管理器,将所有WildFly服务器日志重定向至应用配置的Log4j2?能否通过Java代码或额外XML/属性文件实现?
  2. 若上述方案不可行,如何使用WildFly默认服务器日志?我尝试使用java.util.logging类,但未在控制台及独立日志文件中输出任何内容。
  3. 为理清思路:在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启动参数中添加:
    -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
    
    同时将Log4j2核心jar包(log4j-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:25:57