Modèle de conception Apt pour enregistrer chaque demande dans Spring boot Java


Je construis un Journal d'audit pour mon application spring boot. Je veux suivre chaque POST request sur mon serveur Web(même les échecs) dans DB. Mon code d'audit a encombré mon contrôleur. Quelqu'un peut-il suggérer un modèle de conception approprié pour le rendre propre, générique et maintenable.

@JsonView(View.Student.class)
@PostMapping("/updateStudent")
public Student updateStudent(@Valid @RequestBody final Student  studentConfig) {

    Student oldStudentDefn =                        
                  repository.findById(studentConfig.getStudentId())
                     .map(Function.identity()).orElse(null);

    final AuditBuilder builder = aAuditBuilder().withAction("UPDATE")
        .withSource("GUI")
        .withBeforeObj(oldStudentDefn)
        .withAfterObj(studentConfig);

    try{
        if(repository.save(studentConfig)) {
            builder.withStatus("Success");
        } else {
            throw new ApplicationException(" Student Save failed");
        }
    }catch(ApplicationException e) {
        builder.withStatus("Failure");
                    throw e;
    }

    finally {
        auditService.save(builder.build());
    }

}

Je veux refactoriser telle manière que cette répétitif try-catch constructeur pour chaque point de terminaison va à un service commun et qui est suffisamment générique pour accepter tout type d'objet afin que même les points de terminaison Teacher,Section,ProgressReport, etc. puissent également être audités en appelant le même service, mais il ne devrait pas y avoir de duplication de code.

Author: James Z, 2019-01-12

2 answers

Avec Spring Boot, vous intégrez probablement un conteneur de servlet. Au lieu de développer cette fonctionnalité, vous pouvez utiliser le conteneur de servlet installations par exemple Tomcat a journal d'accès configurable avec AccessLogValve. Il devrait suffire de sortir le fichier journal, puis de le convertir et de l'importer dans la base de données to.

Si vous avez besoin d'une solution plus en temps réel, vous pouvez regarder dans une bibliothèque de surveillance comme Jaegerou Micromètre.

Point est, il y a des moyens plus faciles pour obtenir cette fonctionnalité que d'écrire votre propre code, sauf si vous avez une exigence particulière.

 2
Author: Karol Dowbecki, 2019-01-12 14:25:28

S'appuyant sur la grande réponse de Karol (https://stackoverflow.com/a/54160447/8231165), je suggère également d'utiliser un cadre existant pour vos besoins.

Un exemple serait d'expédier les journaux via l'appender/encoder Logstash pour Logback, puis de les stocker / les manipuler via ELK stack (plus de détails ici: https://www.baeldung.com/java-application-logs-to-elastic-stack). Logstash a une riche liste de plugins de sortie, comme un pour MongoDB.

Un autre une alternative serait de publier des événements de journal dans un courtier de messages tel que RabbitMQ, puis de demander à un consommateur de faire tout ce dont il a besoin pour que ces événements soient stockés dans une base de données.

Sur une note de côté, tout ce code try-catch-finally pourrait être placé dans une méthode distincte (peut-être dans une classe Util).

 1
Author: Greg, 2019-01-22 15:28:29