
JBoss 7 默认使用 JUL 兼容的 LogManager,不支持直接将 JVM 系统属性(如 -Dprop=CLI_TEST)映射到 MDC;需改用 %{prop} 语法在日志 pattern 中引用系统属性。
jboss 7 默认使用 jul 兼容的 logmanager,不支持直接将 jvm 系统属性(如 `-dprop=cli_test`)映射到 mdc;需改用 `%{prop}` 语法在日志 pattern 中引用系统属性。
在 JBoss 7.3 中,日志子系统基于 JBoss LogManager(非 Log4j 或 Logback),其模式占位符语法与常见框架不同:它不识别 MDC 键(如 %X{prop})来读取系统属性,也不自动将 -D 参数注入 MDC。你观察到 (%X{prop}) 始终为空,正是因为 %X{} 仅读取当前线程的 Mapped Diagnostic Context(需显式调用 MDC.put("prop", ...)),而命令行 -Dprop=CLI_TEST 设置的是 JVM 系统属性(System.getProperty("prop")),二者完全隔离。
✅ 正确做法:使用 %{prop}(注意是 %{},不是 %X{} 或 %K{})——这是 JBoss LogManager 特有的语法,用于直接插入系统属性值。
请将 standalone_TEST.xml 中的日志 pattern 修改为:
<code class="xml"><pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p (%{prop}) [%c] (%t) %s%e%n"></pattern-formatter></code>
? 说明:
%{prop}会动态解析System.getProperty("prop"),因此运行时执行:<code class="bash">./bin/standalone.sh -Djboss.server.default.config=standalone_TEST.xml -Dprop=CLI_TEST</code>日志行将正确显示:
<code>19:09:57,872 INFO (CLI_TEST) [com.test.lib.TestController] (default task-1) Logging some details</code>
⚠️ 注意事项:
-
%{key}区分大小写,确保-Dprop=...的 key 与 pattern 中{prop}完全一致; - 若系统属性未设置(如遗漏
-Dprop),%{prop}将渲染为空字符串,不会报错; - Maven
<properties></properties>(如<prop>TEST</prop>)仅在构建期生效,不影响运行时,无法被 JBoss 日志系统读取;如需构建时注入配置,应使用 Maven 资源过滤(filtering)将${prop}替换为实际值并写入standalone_TEST.xml,或改用外部配置文件; - 不要混淆
%{prop}(系统属性)、%X{prop}(MDC)、%P{prop}(JVM 系统属性别名,部分旧版支持,但 JBoss 7.3 推荐统一用%{prop})。
? 补充验证方式:可在启动后通过 JBoss CLI 检查系统属性是否生效:
<code class="bash">./bin/jboss-cli.sh --connect --command="/core-service=platform-mbean/type=runtime:read-attribute(name=system-properties)"</code>
确认 "prop" => "CLI_TEST" 存在,即可排除启动参数传递失败问题。
综上,核心原则是:JBoss LogManager 的日志 pattern 中,系统属性必须用 %{key} 引用,而非依赖 MDC 或其他框架惯用语法。










