在我们的日志中,我们看到了信用卡号,原因是有人在我们的应用程序中使用CC信息击中了某些ULR(我不知道他们为什么这样做)。我们要清理此信息(出于PCI考虑),甚至不将其持久化到磁盘上。
因此,我希望能够在日志条目到达日志文件之前对其进行清理。我一直在寻找Tomcat Valves(Access Log Valve)。这是要走的路吗?
我能够通过扩展AccessLogValve和覆盖来解决此问题public log(java.lang.String message):
AccessLogValve
public log(java.lang.String message)
public class SanitizedAccessLogValve extends AccessLogValve { private static Pattern pattern = Pattern.compile("\\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})\\b"); /* This method will sanitize any cc numbers in the string and replace them with x's */ private String sanitize(String string) { String sanitizedString = string; if(string != null) { StringBuffer buffer = new StringBuffer(); Matcher matcher = pattern.matcher(string); while(matcher.find()) { MatchResult matchResult = matcher.toMatchResult(); int start = matchResult.start(); int end = matchResult.end(); String matchedText = string.substring(start, end); matcher.appendReplacement(buffer, "xxxxxxxxxxxxxxxx"); } matcher.appendTail(buffer); sanitizedString = buffer.toString(); } return sanitizedString; } @Override public void log(String message) { super.log(sanitize(message)); } }
您需要将其编译到一个jar中,然后将该jar文件放入中$CATALINA_HOME/lib。
$CATALINA_HOME/lib
然后在您的server.xml:
server.xml
<Valve className="my.valves.SanitizedAccessLogValve" directory="access_logs" prefix="localhost." suffix=".log" pattern='%v %h %t "%r" %s %B %T "%{User-Agent}i"'/>