提问人:Sujit Kumar Mishra 提问时间:7/13/2023 更新时间:7/13/2023 访问量:48
从新创建的 Thread 中使用 PatternLayout 类的 format(LoggingEvent 事件)方法独立执行自定义日志掩码逻辑
Use of PatternLayout class's format(LoggingEvent event) method from a newly created Thread to execute custom log masking logic independently
问:
无法从新创建的 Thread 调用 PatternLayout 类的 format(LoggingEvent 事件)方法,以独立执行自定义日志掩码逻辑,而不会对实际功能产生任何影响。出现多个错误,例如 -
- 编译器要求使 LoggingEvent 对象成为最终对象。
- 无法将屏蔽响应存储到 run() 方法中的全局变量 maskedOutput 中,我们希望从 format(LoggingEvent event) 方法返回该变量。
以下是实际代码:-
public class CardNumberFilteringLayout extends PatternLayout {
private static final String MASK = "$1++++++++++++";
private static final Pattern PATTERN = Pattern.compile("([0-9]{4})([0-9]{9,15})");
@Override
public String format(LoggingEvent event) {
if (event.getMessage() instanceof String) {
String message = event.getRenderedMessage();
Matcher matcher = PATTERN.matcher(message);
if (matcher.find()) {
String maskedMessage = matcher.replaceAll(MASK);
@SuppressWarnings({ "ThrowableResultOfMethodCallIgnored" })
Throwable throwable = event.getThrowableInformation() != null ?
event.getThrowableInformation().getThrowable() : null;
LoggingEvent maskedEvent = new LoggingEvent(event.fqnOfCategoryClass,
Logger.getLogger(event.getLoggerName()), event.timeStamp,
event.getLevel(), maskedMessage, throwable);
return super.format(maskedEvent);
}
}
return super.format(event);
}
}
根据我们的要求,我们正在尝试将上面的一段代码更改为以下内容:-
@Override
public String format(LoggingEvent event) {
String maskedOutput = null;
new Thread(new Runnable() {
@Override
public void run() {
maskedOutput = //Masking Logic(Same As Above)
}
}).start();
return maskedOutput;
}
答:
1赞
Piotr P. Karwasz
7/13/2023
#1
Log4j 1.2 自 2015 年起不再受支持。所有现代替换都具有某种正则表达式替换支持。
在 Log4j 2.x 中,您可以使用:
<PatternLayout pattern="your_pattern">
<Replace regex="(\d{4})\d{8}(\d{4})" replacement="$1********$2"/>
</PatternLayout>
或
<PatternLayout pattern="%replace{your_pattern}{(\d{4})\d{8}(\d{4})}{$1********$2}"/>
在 Logback 中,您可以使用:
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>
%replace(your_pattern){"(\d{4})\d{8}(\d{4})", "$1********$2"}
</pattern>
</encoder>
评论
maskedOutput