Log4j2切换为EcsLayout后日志脱敏失效,求配置方案
解决EcsLayout下Log4j2日志脱敏失效的问题
原来的%spi是PatternLayout专属的自定义转换器,EcsLayout不支持这类占位符,可通过以下几种方式重新实现脱敏:
方法1:用RewriteAppender在输出前脱敏日志内容
RewriteAppender能在日志事件传递到EcsLayout之前修改消息内容,直接复用你已有的脱敏逻辑:
- 保留原有脱敏转换器(
com.usbank.digitalservices.common.log.mask下的实现) - 修改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,在消息生成阶段完成脱敏:
- 实现
org.apache.logging.log4j.message.MessageFactory接口,在newMessage方法中调用原有脱敏逻辑处理内容 - 在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
相关产品推荐
相关产品推荐

