IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Logging Java Discussion :

Logger ce qui est utile et pas plus


Sujet :

Logging Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2016
    Messages : 31
    Points : 29
    Points
    29
    Par défaut Logger ce qui est utile et pas plus
    Bonjour à tous,
    Je cherche depuis hier une réponse à un problème de logs mais je ne trouve pas exactement ce que je veux donc je viens vous embêter un peu.
    Voici le contexte :
    Une application sur Glassfish mets à disposition des utilisateurs une large panoplie de web service (environ 150).
    Nous utilisions LoggingFilter afin d'afficher tous les appels (paramètres d'entrée et résultat de la requête).
    Bon, presque 10 000 utilisateurs, le traitement fait une dizaine d'appels à chaque connexion, autant vous dire que les logs sont un vaste purgatoire : un fichier de 2Mo toutes les 30/40 secondes, bref inexploitable.
    On m'a demandé de simplifier cette chose, j'ai donc viré LoggingFilter mais j'aimerais un système de log un peu plus intelligent : aucune trace pour les appels OK mais quand une exception sort, afficher les paramètres et cette dernière.

    J'ai cherché via les intercepteurs mais apparemment ça ne choppe pas les exceptions.
    J'ai regardé aussi les exception handler mais ça ne semble pas récupérer les paramètres de la méthode de base donc pas vraiment utilisable.

    Connaîtriez-vous un système qui fasse ce que je veux?
    Si oui, avez-vous une adresse pour une doc ou un tuto?

    Et comme je suis un peu maso, j'ai une autre idée en tête : mettre en place un fichier listant différents ws qui seraient loggés comme avant : paramètres et résultat même si OK.
    Si en plus vous pouvez m'aider pour ça, vous seriez mes héros.

    Un peu d'architecture :
    les WS sont dispatchés dans une vingtaine de classe Resource.
    Toutes ces classes étendent une même classe AbstractResource.
    Les WS sont codés via javax.ws.rs.

    Merci d'avance pour votre aide

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2016
    Messages : 31
    Points : 29
    Points
    29
    Par défaut
    Et bien au final, j'ai réussi.
    En utilisant un intercepteur, on peut englober l'appel dans un try/catch.
    Voici ce que cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    @Stateless
    public class RestInterceptor {
     
        private static final Logger LOGGER = Logger.getLogger(RestInterceptor.class.getName());
     
        @AroundInvoke
        public Object logInvocation(InvocationContext ctx) throws Exception {
            try {
                Object result = ctx.proceed();
                return result;
            } catch (Exception e) {
                String classe = ctx.getMethod().getDeclaringClass().getName();
                String method = ctx.getMethod().getName();
                LOGGER.log(Level.INFO, "Appel à {0}.{1}", new Object[]{classe, method});
                StringBuilder sb = new StringBuilder();
                for (Object parametre : ctx.getParameters()) {
                    if (sb.length() != 0) {
                        sb.append(";");
                    }
                    sb.append(parametre.toString());
                }
                LOGGER.log(Level.INFO, "Paramètres : {0}", sb.toString());
                throw e;
            }
        }
    }
    L'utilisation est on-ne-peut-plus-simple dans les controlleurs (pour mon cas mais peut s'appliquer à toutes classes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @Path("aaa")
    @Stateless
    @Interceptors({JAMonEJBInterceptor.class, RestInterceptor.class})
    public class aaaResource extends AbstractResource {
    Cela permet d'affecter toutes les méthodes de la classe avec l'intercepteur créé.
    Il ne me manque que la gestion du fichier pour remettre le log automatique sous condition mais ce sera au même endroit.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/08/2006, 15h16
  2. int vs double: qui est le plus rapide?
    Par Chewbi dans le forum C++
    Réponses: 23
    Dernier message: 25/03/2006, 02h58
  3. Ne pas afficher un champs qui est vide dans ma BD
    Par yoda_style dans le forum ASP
    Réponses: 3
    Dernier message: 27/04/2004, 11h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo