
JBoss 7 默认使用 JUL 兼容的 LogManager,不支持直接将 JVM 系统属性(如 -Dprop=CLI_TEST)映射到日志 Pattern 中的 MDC 占位符;需改用 %{prop} 语法(注意是花括号而非大括号加 K),且确保属性名与 -D 参数一致。
jboss 7 默认使用 jul 兼容的 logmanager,不支持直接将 jvm 系统属性(如 `-dprop=cli_test`)映射到日志 pattern 中的 mdc 占位符;需改用 `%{prop}` 语法(注意是花括号而非大括号加 k),且确保属性名与 `-d` 参数一致。
在 JBoss 7.3 中,日志子系统基于 JBoss LogManager(JUL 的增强实现),其模式占位符语法与 Log4j 或 SLF4J 的 MDC 机制有本质区别:系统属性(System Properties)不能通过 %K{prop}(MDC 键)自动注入,而必须显式使用 %{prop} 语法引用 JVM 启动时设置的 -D 属性。
✅ 正确配置步骤如下:
-
启动时传入系统属性(保持名称一致):
<code class="bash">./bin/standalone.sh -Djboss.server.default.config=standalone_TEST.xml -Dprop=CLI_TEST</code>
-
修改
standalone_TEST.xml中的 pattern-formatter:
将原<pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p (%X{prop}) [%c] (%t) %s%e%n"></pattern-formatter>
中的(%X{prop})替换为(%{prop})—— 注意:- 使用
%{prop}(不是%K{prop},也不是%X{prop}); -
%{xxx}是 JBoss LogManager 专用语法,用于解析系统属性; -
%X{key}仅适用于 MDC(需代码手动MDC.put("key", value)); -
%K{level}是合法的(内置关键字),但K不支持自定义键。
✅ 正确写法示例:
<code class="xml"><pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p (%{prop}) [%c] (%t) %s%e%n"></pattern-formatter></code> - 使用
-
验证日志输出:
启动后,日志行应类似:<code>19:09:57,872 INFO (CLI_TEST) [com.test.lib.TestController] (default task-1) Logging some details</code>
⚠️ 注意事项:
- Maven
<properties></properties>中定义的<prop>TEST</prop>仅在构建期生效,不会自动转为运行时 JVM 系统属性;若需构建时注入,须配合maven-war-plugin的filtering或maven-resources-plugin+property文件,再通过脚本生成带-Dprop=...的启动命令。 -
%{xxx}区分大小写,且仅查找System.getProperty("xxx"),不支持嵌套或默认值(如%{prop:-DEFAULT}不可用)。 - 若属性未设置,
%{prop}将渲染为空字符串(不会报错),建议在启动脚本中增加校验逻辑。
? 总结:JBoss 7 日志中的动态值注入分两类——
▸ 系统属性 → 用 %{name}(无需代码干预,启动即生效);
▸ 上下文数据(如请求ID、用户信息)→ 用 %X{name} + MDC.put("name", value)(需业务代码主动设置)。
混淆二者是常见误区。请始终以 System.getProperty("prop") != null 为依据,确认属性是否真实注入 JVM。










