Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1201 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°219767
El_gringo
Posté le 25-09-2002 à 09:03:49  profilanswer
 

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
mood
Publicité
Posté le 25-09-2002 à 09:03:49  profilanswer
 

n°219789
El_gringo
Posté le 25-09-2002 à 09:34:57  profilanswer
 

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.

n°219791
benou
Posté le 25-09-2002 à 09:38:16  profilanswer
 

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 ...

n°219793
benou
Posté le 25-09-2002 à 09:38:41  profilanswer
 

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 ... :(

n°219796
El_gringo
Posté le 25-09-2002 à 09:45:30  profilanswer
 

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)

n°219798
darklord
You're welcome
Posté le 25-09-2002 à 09:54:26  profilanswer
 

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
n°219804
El_gringo
Posté le 25-09-2002 à 10:10:28  profilanswer
 

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...

n°219805
darklord
You're welcome
Posté le 25-09-2002 à 10:12:14  profilanswer
 

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
n°219819
El_gringo
Posté le 25-09-2002 à 10:37:57  profilanswer
 

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...

n°219825
darklord
You're welcome
Posté le 25-09-2002 à 10:51:29  profilanswer
 

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
mood
Publicité
Posté le 25-09-2002 à 10:51:29  profilanswer
 

n°219833
El_gringo
Posté le 25-09-2002 à 11:18:55  profilanswer
 

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)
...

n°219835
El_gringo
Posté le 25-09-2002 à 11:21:58  profilanswer
 

...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)

n°219836
darklord
You're welcome
Posté le 25-09-2002 à 11:22:01  profilanswer
 

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
n°219837
El_gringo
Posté le 25-09-2002 à 11:23:20  profilanswer
 

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 ?

n°219840
El_gringo
Posté le 25-09-2002 à 11:32:49  profilanswer
 

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)

n°219856
darklord
You're welcome
Posté le 25-09-2002 à 11:59:58  profilanswer
 

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
n°219861
El_gringo
Posté le 25-09-2002 à 12:21:17  profilanswer
 

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.

n°219910
gfive
Posté le 25-09-2002 à 13:47:11  profilanswer
 

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??

n°219970
benou
Posté le 25-09-2002 à 14:41:38  profilanswer
 

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é ...

n°220094
gfive
Posté le 25-09-2002 à 17:04:56  profilanswer
 

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

n°220178
benou
Posté le 25-09-2002 à 19:04:11  profilanswer
 

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 !!!!

n°220199
MachinBidu​le
Posté le 25-09-2002 à 20:32:02  profilanswer
 

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

n°220213
benou
Posté le 25-09-2002 à 21:30:43  profilanswer
 

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 :/

n°220381
El_gringo
Posté le 26-09-2002 à 09:40:27  profilanswer
 

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>

n°220389
darklord
You're welcome
Posté le 26-09-2002 à 09:48:52  profilanswer
 

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


---------------
Just because you feel good does not make you right
n°220393
El_gringo
Posté le 26-09-2002 à 09:55:49  profilanswer
 

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.

n°220424
--greg--
Posté le 26-09-2002 à 10:55:00  profilanswer
 

[:cupra]

n°220490
darklord
You're welcome
Posté le 26-09-2002 à 11:56:12  profilanswer
 

--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
n°220493
--greg--
Posté le 26-09-2002 à 11:57:29  profilanswer
 

:D

n°220522
darklord
You're welcome
Posté le 26-09-2002 à 12:33:40  profilanswer
 

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


---------------
Just because you feel good does not make you right
n°220616
--greg--
Posté le 26-09-2002 à 14:02:17  profilanswer
 

DarkLord a écrit a écrit :

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



perspicace :o

n°221139
gfive
Posté le 27-09-2002 à 08:59:49  profilanswer
 

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....

n°221140
benou
Posté le 27-09-2002 à 09:03:42  profilanswer
 

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à)

n°221141
lorill
Posté le 27-09-2002 à 09:06:06  profilanswer
 

common/classes plutot, non ?

n°221143
benou
Posté le 27-09-2002 à 09:07:18  profilanswer
 

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 ...

n°221146
lorill
Posté le 27-09-2002 à 09:08:42  profilanswer
 

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

n°221147
benou
Posté le 27-09-2002 à 09:09:08  profilanswer
 

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

n°221148
benou
Posté le 27-09-2002 à 09:10:25  profilanswer
 

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

n°221149
benou
Posté le 27-09-2002 à 09:11:55  profilanswer
 

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.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
[PHP] Mettre un cadre de couleur dans INPUT...?un Script déroulant dans une petite partie d'une page HTML sans cadre?
[PHP] J'arrive pas à enlever les " \ " devant les caractères spéciauxj'arrive pas a faire ma variable de variable...... [ - job's done - ]
Dreamweaver: gestion cadres - gestion jeu de cadreJ'arrive pas à installé VS6 sous XP alors ke sous 2000 et 98..
[open GL] je n'arrive pas à rester sur mon repère global fixe !J'arrive pas à activer la colorisation sous WinEmacs
KIT Graphique a Mettre en cadre????[PHP] j'arrive pas a recuperer les champs d'un formulaire !?
Plus de sujets relatifs à : Log4j dans le cadre d'une web-app, j'arrive pas !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR