1+ package br .com .multidatasources .config .logging ;
2+
3+ import ch .qos .logback .classic .spi .ILoggingEvent ;
4+ import ch .qos .logback .core .pattern .CompositeConverter ;
5+
6+ import java .io .BufferedReader ;
7+ import java .io .IOException ;
8+ import java .io .InputStream ;
9+ import java .io .InputStreamReader ;
10+ import java .util .Collections ;
11+ import java .util .HashMap ;
12+ import java .util .List ;
13+ import java .util .Map ;
14+ import java .util .regex .Matcher ;
15+ import java .util .regex .Pattern ;
16+
17+ public class ObfuscateLoggingConverter extends CompositeConverter <ILoggingEvent > {
18+
19+ private static final Map <String , Pattern > sensitiveFieldPatterns = new HashMap <>();
20+ private static final int GROUP_FIELD_IN_MESSAGE_INDEX = 1 ;
21+ private static final int GROUP_FIELD_IN_JSON_INDEX = 2 ;
22+
23+ static {
24+ final List <String > fieldNames = getAllSensitiveFieldNames ();
25+ for (final String fieldName : fieldNames ) {
26+ final String regex = "(?i)\\ b" + Pattern .quote (fieldName ) + "\\ b\\ s*[:=]\\ s*\" ?([^\" ,\\ s]*)\" ?|\" " + Pattern .quote (fieldName ) + "\" :\" ([^\" ]*)\" " ;
27+ sensitiveFieldPatterns .put (fieldName , Pattern .compile (regex ));
28+ }
29+ }
30+
31+ @ Override
32+ protected String transform (final ILoggingEvent event , final String in ) {
33+ String message = in ;
34+ for (Map .Entry <String , Pattern > entry : sensitiveFieldPatterns .entrySet ()) {
35+ message = obfuscateFieldValue (message , entry .getValue ());
36+ }
37+ message = obfuscateArguments (event .getArgumentArray (), message );
38+ message = obfuscateMDC (event .getMDCPropertyMap (), message );
39+ return message .concat ("\n " );
40+ }
41+
42+ private static String obfuscateFieldValue (final String message , final Pattern pattern ) {
43+ final Matcher matcher = pattern .matcher (message );
44+ final StringBuilder sb = new StringBuilder ();
45+ while (matcher .find ()) {
46+ if (matcher .group (GROUP_FIELD_IN_MESSAGE_INDEX ) != null ) {
47+ matcher .appendReplacement (sb , matcher .group ().replace (matcher .group (GROUP_FIELD_IN_MESSAGE_INDEX ), "****" ));
48+ }
49+ if (matcher .group (GROUP_FIELD_IN_JSON_INDEX ) != null ) {
50+ matcher .appendReplacement (sb , matcher .group ().replace (matcher .group (GROUP_FIELD_IN_JSON_INDEX ), "****" ));
51+ }
52+ }
53+ matcher .appendTail (sb );
54+ return sb .toString ();
55+ }
56+
57+ private static String obfuscateArguments (final Object [] arguments , String message ) {
58+ if (arguments != null ) {
59+ for (final Object arg : arguments ) {
60+ if (arg != null ) {
61+ for (final Pattern pattern : sensitiveFieldPatterns .values ()) {
62+ message = obfuscateFieldValue (message , pattern );
63+ }
64+ }
65+ }
66+ }
67+ return message ;
68+ }
69+
70+ private static String obfuscateMDC (final Map <String , String > mdcPropertyMap , String message ) {
71+ if (mdcPropertyMap != null ) {
72+ for (final Map .Entry <String , String > entry : mdcPropertyMap .entrySet ()) {
73+ if (sensitiveFieldPatterns .containsKey (entry .getKey ())) {
74+ message = obfuscateFieldValue (message , sensitiveFieldPatterns .get (entry .getKey ()));
75+ }
76+ }
77+ }
78+ return message ;
79+ }
80+
81+ private static List <String > getAllSensitiveFieldNames () {
82+ try (final InputStream inputStream = ObfuscateLoggingConverter .class .getResourceAsStream ("/obfuscate" )) {
83+ if (inputStream == null ) {
84+ return Collections .emptyList ();
85+ }
86+ return new BufferedReader (new InputStreamReader (inputStream )).lines ()
87+ .map (String ::trim )
88+ .toList ();
89+ } catch (final IOException ex ) {
90+ return Collections .emptyList ();
91+ }
92+ }
93+
94+ }
0 commit comments