WildFly 26中autoflush=false时,如何编程式强制刷新服务器日志?
按需刷新WildFly 26的server.log(无需修改autoflush配置)
背景
为优化性能,在WildFly 26的urn:jboss:domain:logging子系统中给periodic-size-rotating-file-handler设置了autoflush="false":
<periodic-size-rotating-file-handler name="FILE" autoflush="false">
此时WildFly会按自身策略批量刷新server.log,但部分场景下需要立即查看最新日志,又不想通过管理控制台修改autoflush(会改动XML配置),之前尝试的大量System.out输出或System.out.flush()均无效。
可行解决方案
1. 通过WildFly CLI临时触发刷新(推荐运维场景)
使用WildFly命令行工具(CLI)执行刷新命令,不会修改持久化配置,执行后autoflush仍保持false:
- 连接到本地WildFly实例:
# Linux/macOS jboss-cli.sh -c # Windows jboss-cli.bat -c
- 执行刷新命令:
/subsystem=logging/periodic-size-rotating-file-handler=FILE:flush()
执行后缓存的日志会立即写入server.log,完全满足按需刷新的需求。
2. 在应用代码中通过API触发刷新(开发场景)
如果需要在应用内部逻辑中触发刷新,可通过WildFly的Logging API直接操作日志处理器:
步骤1:添加依赖(Maven示例)
<dependency> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging</artifactId> <version>3.4.3.Final</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.wildfly.core</groupId> <artifactId>wildfly-logging</artifactId> <version>18.0.4.Final</version> <scope>provided</scope> </dependency>
步骤2:编写刷新工具类
import org.jboss.as.logging.Logging; import org.jboss.logmanager.handlers.PeriodicSizeRotatingFileHandler; import java.util.logging.Handler; public class ServerLogFlusher { public static void flush() { // 遍历全局日志处理器,找到名为FILE的处理器并刷新 for (Handler handler : Logging.getLogManager().getLogger("").getHandlers()) { if (handler instanceof PeriodicSizeRotatingFileHandler) { PeriodicSizeRotatingFileHandler fileHandler = (PeriodicSizeRotatingFileHandler) handler; if ("FILE".equals(fileHandler.getName())) { fileHandler.flush(); break; } } } } }
在需要刷新的逻辑点调用ServerLogFlusher.flush()即可立即写入缓存日志。
原方法无效的原因
WildFly的server.log由FILE日志处理器负责写入,而System.out的输出默认关联的是控制台处理器(CONSOLE),两者属于不同的日志通道,因此System.out.flush()只会刷新控制台输出缓存,无法触发FILE处理器的日志写入。
内容的提问来源于stack exchange,提问作者datatex
相关产品推荐
相关产品推荐

