在我们的 scala api 中,我们logstash-logback-encoder
用来创建 json 日志。我们想加密一个特定的字段。屏蔽是不够的,因为如果需要来自日志,则需要解密该值。实现这一目标的最佳方法是什么?一种方法可能是创建一个实现,JsonGeneratorDecorator
就像有一个用于掩蔽一样。但是鉴于我们知道要屏蔽哪个字段,有没有更简单的方法来实现这一点?
更新:解决方案
我在答案中使用了@Phil Clay 提供的建议。但是,有一个小问题。背后的意图ValueMasker
是根据值决定什么/何时屏蔽。例如,使用 RegEx 匹配所有值(net.logstash.logback.mask.RegexValueMasker)
。由于它们非常通用的用例,ValueMaskers
效率/性能较低。但是,我的用例更具体,因为有一个特定的字段要被屏蔽。根据定义FieldMasker
,应该使用,但它不提供值的句柄以允许加密。最后,我创建了一个自定义ValueMasker
,但使用了net.logstash.logback.mask.FieldNameBasedFieldMasker
如下逻辑:
class FieldNameBasedEncryptionMasker extends ValueMasker {
private var salt: String = ""
private var fieldNames: Set[String] = Set.empty
def addFieldName(fieldName: String): Unit =
fieldNames = fieldNames + fieldName
def setSalt(saltValue: String): Unit =
salt = saltValue
override def mask(context: JsonStreamContext, value: Any): AnyRef = {
if (context.hasCurrentName && fieldNames.contains(context.getCurrentName) && value
.isInstanceOf[CharSequence]) {
// encrypt value
} else null
}
}
这可以在 `logback.xml 中配置为:
<appender name="stash" class="net.logstash.logback.appender.LogstashSocketAppender">
<host>$host</host>
<port>$port</port>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"app_name":"${LOG_APP_NAME:-undefined}", "app_env":"${LOG_ENV:-local}"}</customFields>
<jsonGeneratorDecorator class="net.logstash.logback.mask.MaskingJsonGeneratorDecorator">
<valueMasker class="FieldNameBasedEncryptionMasker">
<salt>$logging-encryption-salt</salt>
<fieldName>fieldNameToEncrypt1</fieldName>
<fieldName>fieldNameToEncrypt2</fieldName>
</valueMasker>
</jsonGeneratorDecorator>
</encoder>
</appender>