Log4j dans le cadre d'une web-app, j'arrive pas !

Log4j dans le cadre d'une web-app, j'arrive pas ! - Java - Programmation

Marsh Posté le 25-09-2002 à 09:03:49    

j'arrive à utiliser log4j dans une appli Java simple, c déja ça.
Mais dans ma webapp, j'arrive pas à générer un fichier log, j'comprend pas.
 
Voila comment je m'y prend pour utiliser Log4j ds ma webapp:
- Ajout de "log4j-1.2.6.jar" dans le rep "lib" de ma wen-app
- Création d'un fichier de config "log4j.xml" placé à la racine de la web-app (avant le rep WEB-INF).
Mon fichier log4j.xml :

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 
<log4j:configuration>
        <appender name="A_1" class="org.apache.log4j.DailyRollingFileAppender">            
            <param name="File"   value="C:\Tomcat4\logs\LdsWeb2.log" />
            <param name="Append" value="true" />
            <param name="DatePattern" value="'.'yyyy-MM-dd" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{3}] - %m%n"/>
            </layout>        
        </appender>        
 
        <category name="org.apache.log4j.xml">
          <appender-ref ref="A_1" />
        </category>
         
        <root>
           <priority value ="debug" />
           <appender-ref ref="A_1" />
        </root>
</log4j:configuration>


 
- dans ma servlet (méthode init (ServletConfig config)), je configuer log4j par le code suivant :

Code :
  1. try {
  2. InputStream  is = getServletContext().getResourceAsStream("/log4j.xml" );
  3. new DOMConfigurator ().doConfigure (is, LogManager.getLoggerRepository ());
  4. }
  5. catch (Exception e) {
  6. System.out.println ("Couldn't initialize logging" );
  7. e.printStackTrace ();
  8. }


 
Ensuite, pour logguer un message je fais exactement comme tu dis dans ta leçon.
Au final, quand je lance Tomcat, aucune exception n'est lancée (initialisation/configuration ok ?).
Quand un message est censé être loggé, tjs pas d'exception.
Ms au final, mon ldsWeb2.log n'est pas créé !!!! :fou:


Message édité par El_gringo le 25-09-2002 à 09:08:50
Reply

Marsh Posté le 25-09-2002 à 09:03:49   

Reply

Marsh Posté le 25-09-2002 à 09:34:57    

Ha... petit complément : On peut être sur que le fichier log4j.xml est correctement lu (partie initialisation ok), car, si je met n'imp comme fichier log (à la place de "C:\tomcat4\logs\LdsWeb2.log" ), je me prend une exception (chemin invalide) dans la tête.

Reply

Marsh Posté le 25-09-2002 à 09:38:16    

si tu fais un getResourceAsStream, il faut que le fichier soit dans ton classpath => dans WEB-ING/classes.
 
remarque : je ne sais pas comment marche le getResourceAsStream du servlet Context, mais epour le ClassLoader c'est comme ca en tout cas ...

Reply

Marsh Posté le 25-09-2002 à 09:38:41    

El_Gringo a écrit a écrit :

Ha... petit complément : On peut être sur que le fichier log4j.xml est correctement lu (partie initialisation ok), car, si je met n'imp comme fichier log (à la place de "C:\tomcat4\logs\LdsWeb2.log" ), je me prend une exception (chemin invalide) dans la tête.




bon, ben c'est pas ca alors ... :(

Reply

Marsh Posté le 25-09-2002 à 09:45:30    

benou a écrit a écrit :

 
bon, ben c'est pas ca alors ... :(




 
hé non, dommage, j'aurais préféré !
Donc la question est encore la même qu'au début.
(merci qd même Benou)

Reply

Marsh Posté le 25-09-2002 à 09:54:26    

ca a l'air correct. Ceci dit je mettrai l'init de log4j dans un ServletContextListener plutôt. C'est plus propre et au moins tu es sur que tout est fait au démarrage du serveur applicatif.
 
Là comme ça je ne vois pas. Tu es bien sur que tu n'as aucune exception.
 
Est ce que tu as lancé tomcat en ligne de commande pour voir (parce que l'exception si il y a un problème est balancé à la console évidemment).


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 25-09-2002 à 10:10:28    

J'utilise que fonction de base de mon moteur de servlet, je sais pas utiliser un servlet context listener.  :D  
 
Sinon, oui, bien sur, je lance Tomcat en ligne de commande. J'ai la console quoi, si une exception était lancée, je la verrai. D'ailleurs lis mon post de complément du 1er post...

Reply

Marsh Posté le 25-09-2002 à 10:12:14    

euh ... Bon un truc tout simple.
 
Arrete tomcat
Dans c:\Tomcat4\logs vire le fichier LdsWeb2.log
Redémarre tomcat
 
est ce qu'un fichier lds2Web.log est crée (meme vide)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 25-09-2002 à 10:37:57    

DarkLord a écrit a écrit :

euh ... Bon un truc tout simple.
 
Arrete tomcat
Dans c:\Tomcat4\logs vire le fichier LdsWeb2.log
Redémarre tomcat
 
est ce qu'un fichier lds2Web.log est crée (meme vide)




 
Je peux pas effacer LdsWeb2.log puisqu'il n'a jammais été créé !
Autre chose : Quand j'utilise Tomcat construit dans l'IDE d'Idea, ça fonctionne...

Reply

Marsh Posté le 25-09-2002 à 10:51:29    

bon c'est très simple. Si ton fichier n'est pas crée c'est que log4j n'a pas lancé sa configuraiton proprement. Lorsque log4j est configuré il crée les fichiers avec une taille de 0.
 
Et bon si ca marche dans IDEA. Je dirai que c'est une merde de classpath comme d'habitude. Tu as bien regardé TOUT les logs?
 
Ce qui se passe probablement c'est que tu compiles ta servlet et que ca passer car tu as log4j.jar dans ton environnement mais une fois que tu lances ta servlet il ne trouve rien et comme tu catch Exception ....


Message édité par darklord le 25-09-2002 à 10:52:26

---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 25-09-2002 à 10:51:29   

Reply

Marsh Posté le 25-09-2002 à 11:18:55    

Ha, merde, j'avais pas regardé dans le log, désolé, je suis lourd (je m'accable tout seul, pas la peine d'en rajouter ! :D).
Dans le log de Tomcat, g bien une exception :

2002-09-25 10:12:31 StandardManager[/ldsweb] IOException while loading persisted sessions: java.io.EOFException
java.io.EOFException
 at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2150)
...

Reply

Marsh Posté le 25-09-2002 à 11:21:58    

...Même une 2e exception juste après :

2002-09-25 10:12:31 StandardManager[/ldsweb] Exception loading sessions from persistent storage
java.io.EOFException
 at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2150)
...


 
Elle sont lancée au démarrage de Tomcat (initialisation de ma servlet, configuration de log4j)

Reply

Marsh Posté le 25-09-2002 à 11:22:01    

El_Gringo a écrit a écrit :

Ha, merde, j'avais pas regardé dans le log, désolé, je suis lourd (je m'accable tout seul, pas la peine d'en rajouter ! :D).



 
Non je confirme que effectivement tu es très lourd ...
 
Mais bon je peux comprendre que regarder les logs n'est pas intuitif quand on débute. C'était mon cas qd j'étais à l'unnif.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 25-09-2002 à 11:23:20    

Mais je pense pas que ça soit un pb de classpath, parce que j'ai bien mis log4j.jar (c pas le nom exact, ms on s'comprend) dans le repertoire "lib" de ma webapp. ça devrait suffir normalement, non ?

Reply

Marsh Posté le 25-09-2002 à 11:32:49    

Bon, allez, c'est bon, j'ai trouvé d'ou ça venait.
En fait dans log4j.xml, pour le nom du fichier de log, je doublais pas les '\'
Et Dark, comment je fait pour utiliser le ServletContextListener plutot que le fichier log4j.xml que g créé (enfin, recopié sur ton article ! :D)

Reply

Marsh Posté le 25-09-2002 à 11:59:58    

El_Gringo a écrit a écrit :

Bon, allez, c'est bon, j'ai trouvé d'ou ça venait.
En fait dans log4j.xml, pour le nom du fichier de log, je doublais pas les '\'
Et Dark, comment je fait pour utiliser le ServletContextListener plutot que le fichier log4j.xml que g créé (enfin, recopié sur ton article ! :D)




 
Ca m'étonne ca. Normallement tu n'as pas besoin de faire ca dans un fichier XML à ma souvannce.
 
Sinon pour servletcontextListener c'est assez simple. Tu vas sur l'api servet et tu regardes cette interface
 
tu crées une classe genre
 
public class Log4JInitializator implements ServletContextListener
 
tu vas avoir deux méthodes à implémenter:
 
contextCreated -> ton serveur démarre
contextDestroyed -> ton serveur est en train de s'arrêter
 
dans contextCreated tu fous tes brols d'initialisation log4J. Ensuite tu dois enregistrer ta classe. Pour ce faire, dans ton web.xml tu dois ajouter une entrée  
 
<listener> avec le nom complet de la classe </listener> (un petit coup de google pour etre sur de la syntaxe.
 
Et voilà. Ca se fait tout seul :)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 25-09-2002 à 12:21:17    

DarkLord a écrit a écrit :

 
 
Ca m'étonne ca. Normallement tu n'as pas besoin de faire ca dans un fichier XML à ma souvannce.
 
Sinon pour servletcontextListener c'est assez simple. Tu vas sur l'api servet et tu regardes cette interface
 
tu crées une classe genre
 
public class Log4JInitializator implements ServletContextListener
 
tu vas avoir deux méthodes à implémenter:
 
contextCreated -> ton serveur démarre
contextDestroyed -> ton serveur est en train de s'arrêter
 
dans contextCreated tu fous tes brols d'initialisation log4J. Ensuite tu dois enregistrer ta classe. Pour ce faire, dans ton web.xml tu dois ajouter une entrée  
 
<listener> avec le nom complet de la classe </listener> (un petit coup de google pour etre sur de la syntaxe.
 
Et voilà. Ca se fait tout seul :)




 
En tout cas, maintenant que g doublé les '\', ça marche.
 
Merci pour le ServletContextListener, j'vais essayer ça après manger.

Reply

Marsh Posté le 25-09-2002 à 13:47:11    

Euuh, sinon, ous, avec Tomcat, on a des problèmes marrants, avec les getRessourceAsStream :
 
Si on fait ça :  

Code :
  1. class Toto {
  2. static {
  3. Properties p = new Properties();
  4. p.load(p.getClass().getResourceAsStream("/toto.properties" ));
  5. }
  6. ...

 
 
Ca marche pas!!
 
Alors que :  

Code :
  1. class Toto {
  2. static {
  3. Properties p = new Properties();
  4. p.load(Toto.getClass().getResourceAsStream("/toto.properties" ));
  5. }
  6. ...

 
 
Etonnant, non??

Reply

Marsh Posté le 25-09-2002 à 14:41:38    

ben nan c'est normal !
 
quand tu fait le p.getClass().getResourceAsStream, il utilise le ClassLoader qui a servit à charger la classe Properties. Comme Properties doit être utilisé par tomcat, le classloader utilisé est celui du chargement de Tomcat.
 
Tomcat gère ses propres ClassLoader, ce qui lui permet d'avoir des classpath différents pour chaque web-app => dans chaque web-app, les classes qui devraont être chargées utiliseront leur propre ClassLoader
 
Si ta class Toto est une class d'une de tes web-app, elle sera chargé par le ClassLoader de la web-app. donc quand tu feras un Toto.getClass().getResourceAsStream(), c'est le classloader de cette web-app qui sera utilisé (avec le classpath vers le rep WEB-INF/classes où est ton fichier de properties).
 
Le classloader de Tomcat lui n'a pas connaissances des différentes web-app => tu ne peux pas l'utiliser pour accéder à des fichiers de propriétés d'une web-app => il ne faut pas que tu fasses le getClass() sur des objets qui ne sont pas dépendant de ta web-app => pas un des objets de la jdk.
 
La bonne technique c'est de toujour faire un this.getClass(). (ou NomDeTaClasse.class si tu est dans un contxt static). Comme ca t'es pas emmerdé.
 
autre solution, passer par le ClassLoader du currentThread, mais là je connais pas trop et ca devient vraiment compliqué ...

Reply

Marsh Posté le 25-09-2002 à 17:04:56    

ouais, remarques, ça se défend...Ou alors, vu que la conf de toutes les web-apps sera commune, pour pas se faire chier, je la met dans un rep. du classpath de tomcat (enfin, je fais un lien, quoi)...Mais c'est un peu du bidouillage! :p

Reply

Marsh Posté le 25-09-2002 à 19:04:11    

gfive a écrit a écrit :

ouais, remarques, ça se défend...Ou alors, vu que la conf de toutes les web-apps sera commune, pour pas se faire chier, je la met dans un rep. du classpath de tomcat (enfin, je fais un lien, quoi)...Mais c'est un peu du bidouillage! :p




c'est vachement dégeu tu veux dire !!!!

Reply

Marsh Posté le 25-09-2002 à 20:32:02    

Pour récupérer une ressource située dans l'arboresence de mon appli web, je préfère utiliser la méthode suivante que je trouve plus propre que getResourceAsStream():
 
Appeler la méthode getRealPath("toto.txt" ) sur une référence de ServletContext
 
Ainsi, je suis sûr que la ressource retournée est bien celle que je veux (c-à-d celle de ma webapp) car le getRealPath() recherche uniquement dans les répertoires de la webapp.
 
Si je dis ça c'est parcequ'il me semble que si tu appelles getResourceAsStream("toto.txt" ) et qu'un fichier toto.txt existe hors de l'arborescence de ta webapp, Java risque de te retourner une référence vers ce fichier !
 
Sinon, pour la configuration de log4j. Je crois qu'utiliser des slashs au lieu des anti-slashs (en séparateur de fichier) est plus portable car Java interprète les slashs même sous Windows.
 
Enfin, c'que j'en dis  :p

Reply

Marsh Posté le 25-09-2002 à 21:30:43    

le problème de ton truc c'est que les fichiers sont en libre accès sur le site => pour des fichiers de properties c'est pas top :/

Reply

Marsh Posté le 26-09-2002 à 09:40:27    

DarkLord a écrit a écrit :

 
 
Ca m'étonne ca. Normallement tu n'as pas besoin de faire ca dans un fichier XML à ma souvannce.
 
Sinon pour servletcontextListener c'est assez simple. Tu vas sur l'api servet et tu regardes cette interface
 
tu crées une classe genre
 
public class Log4JInitializator implements ServletContextListener
 
tu vas avoir deux méthodes à implémenter:
 
contextCreated -> ton serveur démarre
contextDestroyed -> ton serveur est en train de s'arrêter
 
dans contextCreated tu fous tes brols d'initialisation log4J. Ensuite tu dois enregistrer ta classe. Pour ce faire, dans ton web.xml tu dois ajouter une entrée  
 
<listener> avec le nom complet de la classe </listener> (un petit coup de google pour etre sur de la syntaxe.
 
Et voilà. Ca se fait tout seul :)




 
Merci Dark.
Pour info, la syntaxe exacte c'est :

Code :
  1. <listener>
  2.   <listener-class>myApp.myContextListenerClass</listener-class>
  3. </listener>

Reply

Marsh Posté le 26-09-2002 à 09:48:52    

ah ouais c'est l'histoire du class que j'avais oublié :)
 
merci...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 26-09-2002 à 09:55:49    

DarkLord a écrit a écrit :

ah ouais c'est l'histoire du class que j'avais oublié :)
 
merci...




 
C moi qui t'remercie, c vrai que ça fait carrément plus propre.

Reply

Marsh Posté le 26-09-2002 à 10:55:00    

[:cupra]

Reply

Marsh Posté le 26-09-2002 à 11:56:12    

--greg-- a écrit a écrit :

[:cupra]




 
c'est --greg-- qui m'a appris. Enfin je connaissais lorsque j'ai passé la certif mais avec mon employeur précédent, j'avais jamais l'occasion de mettre en pratique
 
donc [:prosterne] --greg--


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 26-09-2002 à 11:57:29    

:D

Reply

Marsh Posté le 26-09-2002 à 12:33:40    

avoue que c'est ce que tu cherchais hein  :sarcastic:
 
[:dawa]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 26-09-2002 à 14:02:17    

DarkLord a écrit a écrit :

avoue que c'est ce que tu cherchais hein  :sarcastic:
 
[:dawa]



perspicace :o

Reply

Marsh Posté le 27-09-2002 à 08:59:49    

benou a écrit a écrit :

 
c'est vachement dégeu tu veux dire !!!!




 
bah...expliques ça aux mecs qui font les mises à jour des produits chez les clients....Pour la cohérence de version, etc, is préfèrent 100 fois faire un truc dégueu mais qui leur permet d'avoir une seule occurence des fichiers de conf et d'internationalisation, et une seule occurence des classes, que une occurence par Web-app....Déjà qu'il y a plusieurs machines, imagine si en plus, tu avais 5 ou 6 lmises à jour çà faire par machine....

Reply

Marsh Posté le 27-09-2002 à 09:03:42    

si ton fichier est partagé, c'est normal qu'il doit mit dans tomcat, mais dans ce cas, il faut le mettre dans le bon rep, pas n'importe où.  
C'est dans le rep classes à la racine de tomcat je crois ... (pas sûr de moi sur ce coup là)

Reply

Marsh Posté le 27-09-2002 à 09:06:06    

common/classes plutot, non ?

Reply

Marsh Posté le 27-09-2002 à 09:07:18    

lorill a écrit a écrit :

common/classes plutot, non ?




nan, justement je croisq ue c'est ca le piège. là c'est des rep pour tomcat.
si quelqu'un peut confirmer ...

Reply

Marsh Posté le 27-09-2002 à 09:08:42    

je vais deja lire le reste du topic, je te dirais ca apres :ange:

Reply

Marsh Posté le 27-09-2002 à 09:09:08    

http://jakarta.apache.org/tomcat/t [...] README.txt
 
ils disent qu'il y a un rep "shared". je l'ai jamais remarqué ...

Reply

Marsh Posté le 27-09-2002 à 09:10:25    

http://www.ing-steen.se:8080/tomca [...] howto.html
bon ben maintenant c'est sûr ...  :ange:

Reply

Marsh Posté le 27-09-2002 à 09:11:55    

lorill a écrit a écrit :

common/classes plutot, non ?




Citation :

Common - This class loader contains additional classes that are made visible to both Tomcat internal classes and to all web applications. Normally, application classes should NOT be placed here.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed