2016-11-18 3 views
2

Ich habe eine statusfreie REST-API auf Spring Boot 1.4.2 erstellt. Ich möchte alle API-Aufrufe in Elch protokollieren. Anforderungen und Antwortdaten (Header, Parameter, Payload) müssen ebenfalls protokolliert werden. Ich möchte sie nicht 1: 1 protokollieren - ich möchte sensible Daten usw. ausfiltern.Auslassen von Feldern während der Serialisierung für bestimmte Gson Serializer

Ich habe einen Aspekt erstellt, der den Methodenaufruf meiner Methode abfängt: @RestController. Ich erstellte eine benutzerdefinierte Annotation für den Parameter der Methode, die protokolliert werden sollte (ich benutze sie auch für Payloads, die von @RequestBody kommentiert wurden), gefolgt von this Artikel, und er gab mir Zugriff auf meine Datenübertragungsobjekte in meinem @Around Rat. Ich interessiere mich nicht für ihren Typ - ich möchte logger.debug(logObject) anrufen und dieses Protokoll an logstash senden.

Soweit ich verstehe Log-Nachricht sollte als JSON mit JSONLayout in Log4j2 Appender gesendet werden, um Dinge auf der Log-Seite zu erleichtern. Also serialisiere ich meine logObject in JSON Log-Nachricht, aber während dieser und dieser nur Serialisierung möchte ich sensible Daten herausfiltern. Ich kann nicht verwenden, weil meine Steuerung vom selben Feld abhängt.

Kann ich irgendwie eine @IgnoreForLogging Annotation erstellen, die nur von meinem benutzerdefinierten Gson-Serialisierer erkannt wird, den ich innerhalb der Protokollierungsberatung verwende und der in der Spring-Infrastruktur ignoriert wird? Ist mein logging in logstash approach sogar korrekt (ich versuche es zum ersten mal einzurichten)?

Antwort

1

Ich kann nicht glauben, dass ich das in der Dokumentation verpasst habe. Here ist der Link

Meine benutzerdefinierte Anmerkung:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface IgnoreForLogging { 
} 

Strategie für die Serialisierung Objekte:

public class LoggingExclusionStrategy implements ExclusionStrategy { 
    @Override 
    public boolean shouldSkipField(FieldAttributes fieldAttributes) { 
     return fieldAttributes.getAnnotation(IgnoreForLogging.class) != null; 
    } 

    @Override 
    public boolean shouldSkipClass(Class<?> aClass) { 
     return false; 
    } 
} 

Lognachricht in Aspekt Klasse Serialisierung:

Gson gson = new GsonBuilder() 
      .setExclusionStrategies(new LoggingExclusionStrategy()) 
      .create(); 
String json = gson.toJson(logObject); 

Auf diese Weise Frühling intern verwendet Standard-Serializer, der nichts überweißund ich kann meine Annotation an anderen Stellen nutzen.

Verwandte Themen