替换 logback 中的多个值

Tad*_*das 7 logback cassandra

我正在尝试替换 logback 记录器中的多个值,该记录器记录 Cassandra CQL 语句并使用了这篇文章中的示例: 使用 logback 屏蔽日志中的敏感数据

其中使用 %replace 函数的调用:

%replace(  %replace(%msg){'regex1', 'replacement1'}  ){'regex2', 'replacement2'}
Run Code Online (Sandbox Code Playgroud)

就我而言,我想替换 3 个字段 - 姓名、姓氏和密码。使用的语句是:

%replace(%replace(%replace(%msg){"first_name='.*'", "first_name='xxxxx'"}){"last_name='.*'", "last_name='yyyyyy'"}){"password='.*'", "password='zzzzzz'"}%n
Run Code Online (Sandbox Code Playgroud)

它似乎工作正常,但我注意到如果字段的顺序不同,有时值会被删除。例如,

1)当语句按以下顺序时就可以了:

执行:

UPDATE usertest.users SET password='secret_pw', last_name='Smith', first_name='John' where user_id = 1745;
Run Code Online (Sandbox Code Playgroud)

记录:

UPDATE usertest.users SET password=zzzzzz, last_name=yyyyyy, first_name=xxxxx where user_id = 1745;
Run Code Online (Sandbox Code Playgroud)

2) 在这种情况下,姓氏被删除

执行:

UPDATE usertest.users SET password='secret_pw', first_name='John', last_name='Smith' where user_id = 1745;
Run Code Online (Sandbox Code Playgroud)

记录:

UPDATE usertest.users SET password=zzzzzz, first_name=xxxxx where user_id = 1745;
Run Code Online (Sandbox Code Playgroud)

3) 在这种情况下密码被删除

执行:

UPDATE usertest.users SET last_name='Smith', password='secret_pw', first_name='John' where user_id = 1745;
Run Code Online (Sandbox Code Playgroud)

记录:

UPDATE usertest.users SET last_name=yyyyyy, first_name=xxxxx where user_id = 1745;
Run Code Online (Sandbox Code Playgroud)

有人可以建议为什么会发生这种情况以及如何修复它或者有其他方法可以解决吗?

Val*_*son 8

This is an issue with the regex pattern picking up more than you intend it to, so the replaces are overwriting each other.

I reproduced the issue you saw, and then changed the regex to include just alphanumerics (\w instead of .) so the pattern looks like this:

%replace(  %replace(  %replace(%msg){"first_name='\w*'", "first_name='xxxxx'"}  ){"last_name='\w*'", "last_name='yyyyyy'"}  ){"password='\w*'", "password='zzzzzz'"}%n
Run Code Online (Sandbox Code Playgroud)

Here are some tests:

UPDATE usertest.users SET password='secret_pw', last_name='Smith', first_name='John' where user_id = 1745;
UPDATE usertest.users SET last_name='Smith', first_name='John', password='secret_pw' where user_id = 1745;
UPDATE usertest.users SET first_name='John', password='secret_pw', last_name='Smith' where user_id = 1745;
UPDATE usertest.users SET first_name='John', last_name='Smith', password='secret_pw' where user_id = 1745;
Run Code Online (Sandbox Code Playgroud)

And the logging results:

Received: QUERY UPDATE usertest.users SET password='zzzzzz', last_name='yyyyyy', first_name='xxxxx' where user_id = 1745;[pageSize = 100], v=4/v4
Received: QUERY UPDATE usertest.users SET last_name='yyyyyy', first_name='xxxxx', password='zzzzzz' where user_id = 1745;[pageSize = 100], v=4/v4
Received: QUERY UPDATE usertest.users SET first_name='xxxxx', password='zzzzzz', last_name='yyyyyy' where user_id = 1745;[pageSize = 100], v=4/v4
Received: QUERY UPDATE usertest.users SET first_name='xxxxx', last_name='yyyyyy', password='zzzzzz' where user_id = 1745;[pageSize = 100], v=4/v4
Run Code Online (Sandbox Code Playgroud)