多数のパターンのいずれかのイベントを検索し、パターン内のテキストをマスクされた値に置き換えることができる必要があります。これは、機密情報がログに記録されるのを防ぐためのアプリケーションの機能です。情報は多種多様なソースから得られる可能性があるため、すべての入力にフィルターを適用するのは現実的ではありません。さらに、ロギング以外にも toString() の用途があり、toString() がすべての呼び出し (ロギングのみ) を一様にマスクすることは望ましくありません。
logback.xml で %replace メソッドを使用してみました:
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %replace(%msg){'f k\="pin">(.*?)</f','f k\="pin">**********</f'}%n</pattern>
これは (山括弧を文字エンティティに置き換えた後) 成功しましたが、1 つのパターンしか置き換えることができません。また、同等のことを実行したいと思います
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %replace(%msg){'pin=(.*?),','pin=**********,'}%n</pattern>
同時に、しかしできません。1 つの %replace で 2 つのパターンをマスクする方法はありません。
interblags で大まかに議論されているもう 1 つの方法は、appender/encoder/layout 階層で何かを拡張することですが、ILoggingEvent をインターセプトしようとするたびに、通常はインスタンス化エラーまたは UnsupportedOperationException によってシステム全体が崩壊します。
たとえば、PatternLayout を拡張してみました。
@Component("maskingPatternLayout")
public class MaskingPatternLayout extends PatternLayout {
@Autowired
private Environment env;
@Override
public String doLayout(ILoggingEvent event) {
String message=super.doLayout(event);
String patternsProperty = env.getProperty("bowdleriser.patterns");
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(event.getMessage());
matcher.replaceAll("*");
}
} else {
System.out.println("Bowdleriser not cleaning! Naughty strings are getting through!");
}
return message;
}
}
次に、logback.xml を調整します。
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<layout class="com.touchcorp.touchpoint.utils.MaskingPatternLayout">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</layout>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/touchpoint.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>logs/touchpoint.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
<encoder>
<layout class="com.touchcorp.touchpoint.utils.MaskingPatternLayout">
<pattern>%date{YYYY-MM-dd HH:mm:ss} %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
</layout>
</encoder>
</appender>
<logger name="com.touchcorp.touchpoint" level="DEBUG" />
<logger name="org.springframework.web.servlet.mvc" level="TRACE" />
<root level="INFO">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
私は他の多くの挿入を試みたので、誰かが私が試みていることを実際に達成したかどうか、そして彼らが手がかりや解決策を提供できるかどうか疑問に思っていました.