Logwex/docs

De sewatech.org.

SewaToc LogUtils sert à enrichir les logs produits par les applications Web afin de restituer des informations issues de la requête ou de la session.

Sommaire

Nom du projet

TocUtils Logging SewaToc LogUtils Logging Extras for Web Applications Logging Web Extras

Prérequis

Mode d'installation

LogUtils peut être installé sous forme d'un filtre de servlet. Ainsi il peut être utilisé dans n'importe quel serveur d'applicaitons JavaEE.

Pour faciliter son utilisation dans Tomcat et les serveurs d'applications qui embarquent Tomcat, comme JBoss ou Jonas, LogUtils peut aussi être installé sous forme de valve.

Framework de logging

LogUtils est avant tout conçu pour fonctionner avec Log4J. LogUtils utilise la technique de MDC, ce qui le rend naturellement incompatible avec JUL ; une adaptation pour SLF4J et LogBack sera envisagée ultérieurement.


Fonctionnement

Comportement par défaut

Le filtre ou la valve de LogUtils intercepte la requête, en extrait les informations principales et les enregistre dans le MDC.

Dans le configuration de Log4J, pour les sorties texte, on peut choisir de faire sortir les informations enregistrées dans le MDC avec le caractère %X{...}.

Les informations sont les suivantes : - ContextPath : request.getContextPath() - ServletPath : request.getServletPath() - Request URL : request.getRequestURL() - PathInfo : request.getPathInfo() - PathTranslated : request.getPathTranslated() - LocalAddr : request.getLocalAddr() - RemoteAddr : request.getRemoteAddr() - RemoteUser : request.getRemoteUser() - ServerName request.getServerName() - ServerPort : request.getServerPort() - SessionId : request.getSessionId()

Question : faut-il récupérer toutes les propriétés de la requête, faut-il configurer cela, avec des groupes prédéfinis ?

En-tête de requête

Par configuration, on peut demander à LogUtils de stocker des informations d'en-tête de requête. La liste des paramètres d'en-tête à prendre en compte est fournie sous forme d'une chaîne de caractères séparés par une virgule.

Par exemple, pour header="X-Forwarded-For,X-Forwarded-Host,X-Forwarded-Server", les informations suivantes sont ajoutées au MDC. - header.X-Forwarded-For : request.getHeader("X-Forwarded-For") - header.X-Forwarded-Host : request.getHeader("X-Forwarded-Host") - header.X-Forwarded-Server : request.getHeader("X-Forwarded-Server")

Attribut de session

Par configuration, on peut demander d'ajouter des attributs de session.

Par exemple, pour session-attributes="username,something", les informations suivantes sont ajoutées au MDC. - session.username : session.getAttribute("username") - session.something : session.getAttribute("something")

Le point est utilisé pour accéder à des propriétés de l'objet. Les attributs de session dont le nom contient un point ne sont pas supportés. Par exemple, pour session-attributes="user.name,user.forname", les informations suivantes sont ajoutées au MDC. - session.user.name : session.getAttribute("user").getName() - session.user.forname : session.getAttribute("user").getForname()

Quelques points restent à affiner : - Si l'attribut est un objet quelconque, il est stocké dans le MDC. - Si l'attribut est une date ?

Pour tous ces attributs, les éventuels espaces sont supprimés.

Attribut d'application

Par configuration, on peut demander d'ajouter des attributs d'application. La notation pointée est supportée pour accéder aux propriétés des attributs.

Par exemple, pour application-attributes="configuration.maxCommands,statistics.commands", les informations suivantes sont ajoutées au MDC. - application.configuration.maxCommands : servletContext.getAttribute("configuration").getMaxCommands() - application.statistics.commands : servletContext.getAttribute("statistics").getCommands()

ThreadLocal

Ce n'est certainement pas significatif de chercher des informations en ThreadLocal à l'arrivée de la requête.

Peut-on faire un Layout qui cherche en TL ?

Si c'est le cas, on pourrait aussi appliquer ça à toutes les infos précédemment citées !!!

Optimisations

Pour les requêtes sur des ressources statiques, comme les images, on ne devrait rien remplir.

Solution alternative

On pourrait mettre la request en ThreadLocal et faire un nouveau PatternLayout qui l'utiliserait directement.

Tests

Tests unitaires

Application de tests

- partie sécurisée (page /security) - servlet, JSP, filtre - attributs de session et d'application - headers de request - page hors session, en session, invalidation de session

Tests d'intégration

Comment tester de façon automatique l'intégration de la valve aux niveaux Engine, Host et Context ?

Problèmes

Le niveau TRACE de log4j ne marche pas (1.2.16). getUserPrincipal ne renvoie rien en valve. getUserPrincipal renvoie tout en filtre : <user username="tomcat" password="tomcat" roles="tomcat,manager"/>

   => récupérer uniquement le name ! => améliorer la notation pointée
Outils personnels
Navigation