Filters
控制日志是否打印
RewritePolicy
重写日志内容
LogEventFactory
创建 LogEvent 工厂
LogEventPatternConverter
日志格式化转化工厂
Layout
输出格式
认识上面 的 API ,日志脱敏适合在 :
日志创建的时候,重写 LogEventFactory 工厂,创建出来脱敏的 LogEvent。
日志重写阶段 RewritePolicy ,实现 RewritePolicy 重写日志,输出脱敏后的日志。
LogEventPatternConverter ,这个阶段也可以进行日志脱敏,但只能拿到 String。
重写 Layout 来脱敏日志不建议,比较复杂,很多 默认实现的 Layout 都是 final 类型,不能继承。
Filters 只能控制日志是否打印,不适用于日志脱敏。
对于 String 的日志,不建议使用 正则表达式 脱敏日志,正则表达式 表达式,会消耗资源,造成系统宕机。
可利用 字符匹配算法 ,KMP , Sunday 等,匹配到关键字进行脱敏。
如实现 RewritePolicy 阶段的,可以通过 对象进行处理,反射,自定义注解等方式,
slf4j-api --> slf4j-log4j-impl --> log4j-api
AbstractLogger --> messageFactory.newMessage() --> ParameterizedMessage/SimpleMessage/ObjectMessage --> push (LogEvent)
listen event --> LogEvent --> LogEventPatternConverter --> PatternLayout --> RewritePolicy
参考:https://blog.csdn.net/qq_27680317/article/details/76408655
public class Solution {
public int strStr(String haystack, String needle) {
if (haystack == null || needle == null) {
return -1;
}
if (needle.isEmpty()) {
return 0;
}
if (haystack.isEmpty()) {
return -1;
}
char[] srcArr = haystack.toCharArray();
char[] tarArr = needle.toCharArray();
int i = 0, j = 0;
while (i + tarArr.length - 1 < srcArr.length) {
if (srcArr[i+j] == tarArr[j]) {
if (j == tarArr.length - 1) {
return i;
}
j++;
continue;
}
if (i+ tarArr.length == srcArr.length) {
return -1;
}
boolean isMatch = false;
for (int k = tarArr.length - 1; k >= 0; k--) {
if (srcArr[i + tarArr.length] == tarArr[k]) {
isMatch = true;
i += tarArr.length - k;
j = 0;
break;
}
}
if (!isMatch) {
i += tarArr.length + 1;
j = 0;
}
}
return -1;
}
}