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

Log4j2切换为EcsLayout后日志脱敏失效,求配置方案

解决EcsLayout下Log4j2日志脱敏失效的问题

原来的%spi是PatternLayout专属的自定义转换器,EcsLayout不支持这类占位符,可通过以下几种方式重新实现脱敏:


方法1:用RewriteAppender在输出前脱敏日志内容

RewriteAppender能在日志事件传递到EcsLayout之前修改消息内容,直接复用你已有的脱敏逻辑:

  1. 保留原有脱敏转换器(com.usbank.digitalservices.common.log.mask下的实现)
  2. 修改log4j2.xml配置,新增RewriteAppender承载脱敏逻辑,再转发给EcsLayout的控制台输出器:
<Configuration xmlns="http://logging.apache.org/log4j/2.0/config" status="OFF"
           packages="com.usbank.digitalservices.common.log.mask">
<Properties>
    <Property name="base.log.dir">./logs</Property>
    <Property name="maxLogFileSize">10 MB</Property>
    <Property name="maxLogFiles">2</Property>
</Properties>
<Appenders>
    <!-- 定义处理脱敏的RewriteAppender -->
    <Rewrite name="REWRITE_MASK">
        <PatternRewritePolicy pattern="%spi"/> <!-- 复用原有脱敏转换器处理消息 -->
        <AppenderRef ref="CONSOLELOG"/>
    </Rewrite>
    
    <!-- 原控制台输出器保留EcsLayout配置 -->
    <Console name="CONSOLELOG" target="SYSTEM_OUT" follow="true">
        <EcsLayout stackTraceAsArray="true" serviceName="my-api"/>
    </Console>
</Appenders>
<Loggers>
    <Root level="info">
        <AppenderRef ref="REWRITE_MASK"/> <!-- 引用脱敏后的RewriteAppender -->
    </Root>
</Loggers>
</Configuration>

方法2:自定义MessageFactory统一处理脱敏

如果日志都是通过Logger的info/debug等方法传入消息,可自定义MessageFactory,在消息生成阶段完成脱敏:

  1. 实现org.apache.logging.log4j.message.MessageFactory接口,在newMessage方法中调用原有脱敏逻辑处理内容
  2. 在log4j2.xml的Configuration节点指定自定义工厂:
<Configuration xmlns="http://logging.apache.org/log4j/2.0/config" status="OFF"
           packages="com.usbank.digitalservices.common.log.mask"
           messageFactory="com.usbank.digitalservices.common.log.mask.CustomMaskMessageFactory">
<!-- 其余配置不变,EcsLayout会直接使用脱敏后的消息作为JSON的message字段 -->
</Configuration>

方法3:针对MDC敏感字段单独处理

若脱敏涉及MDC中的字段,可在EcsLayout中配置mdcKeys指定要输出的字段,同时在设置MDC时提前脱敏,或自定义MDC转换器自动处理:

<EcsLayout stackTraceAsArray="true" serviceName="my-api" mdcKeys="userId,orderId"/>

之后在代码中设置MDC时,直接传入脱敏后的值即可。


另外,你原来的appenderPatternLayout属性在EcsLayout中完全用不上,因为EcsLayout是固定JSON结构,无需Pattern格式,建议删除该属性避免混淆。

内容的提问来源于stack exchange,提问作者Surya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:30:49