我一直在使用logback作为日志框架,现在我要求我需要屏蔽日志中的一些敏感数据。所以我写了一个像这样的编码器:
public class MaskLayot extends PatternLayout {
private String patternsProperty;
public String getPatternsProperty() {
return patternsProperty;
}
public void setPatternsProperty(String patternsProperty) {
this.patternsProperty = patternsProperty;
}
@Override
public String doLayout(ILoggingEvent event){
String message = super.doLayout(event);
if(patternsProperty != null){
String[] patterns = patternsProperty.split("|");
for(int i = 0;i<patterns.length;i++){
Pattern pattern = Pattern.compile(patterns[i]);
Matcher matcher = pattern.matcher(message);
while(matcher.find()){
message = matcher.replaceAll("$1$2****$4$5");
}
}
}
return message;
}
}
然后我写了一个文件appender和一个控制台appender:file appender:
<?xml version="1.0" encoding="UTF-8"?>
<included>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>
${logPath}/${logFile}.log
</file>
<rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>
${logPath}/${logFile}-%d.log.gz
</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="com.idolice.controller.MaskLayot">
<patternProperty>
(.*)(<dateOfBirth>)(.*?)(</dateOfBirth>)(.*) | ...etc(many similar patterns)
</patternProperty>
<pattern>
${fileLogPattern}
</pattern>
</layout>
</encoder>
</appender>
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>500</queueSize>
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="file"/>
</appender>
</included>
和控制台appender:
<?xml version="1.0" encoding="UTF-8"?>
<included>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="com.idolice.controller.MaskLayot">
<patternProperty>
(.*)(<dateOfBirth>)(.*?)(</dateOfBirth>)(.*) | ...etc(many similar patterns)
</patternProperty>
<pattern>
${consoleLogPattern}
</pattern>
</layout>
</encoder>
</appender>
</included>
所以最后我的logback配置文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="default.xml"/>
<include resource="fileAppender.xml"/>
<include resource="consoleAppender.xml"/>
<logger name="com.idolice" level="'INFO"/>
<logger name="com.idolice" level="'DEBUG"/>
<root level="info">
<appender-ref ref="ASYNC"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
在我开始使用MaskLayout之后,我发现在请求发出之前它只花了6秒才能得到响应,但现在需要至少12秒才能得到响应,因此日志配置必须出错,任何人都有一些经验这个?
我看到的一个问题是您正在为每个日志事件编译模式:
Pattern pattern = Pattern.compile(patterns[i]);
这个操作并不便宜,你应该只做一次。也许在构造函数中。