7
votes

Log4j ne connecte rien

Je viens de prendre une application Web existante au travail censé enregistrer son activité en utilisant log4j. J'ai configuré mon espace de travail exactement comme on m'a dit que tout et tout le reste (connexion DB, authentification, etc ...) fonctionne bien, sauf que rien n'est écrit dans le fichier journal. D'autres applications similaires n'ont pas de problème de journalisation.

J'ai examiné la console WebSphere lorsque l'application démarre et il n'y a aucune erreur qui pourrait indiquer pourquoi log4J n'est pas enregistré.

Je l'ai mentionné à un autre dev (qui a déjà travaillé sur cette application, mais pas pendant un certain temps et est plus obsolète que je ne suis là) qui a fait remarquer que c'était un comportement très étrange, mais ne savait pas pourquoi cela pourrait omettre de se connecter et ne signaler aucune erreur.

Je suis allé sur le fichier de configuration et le fichier de propriétés et tout looks ok. Je soupçonne que Log4J ne lisait même jamais le log4j.xml mais je ne suis pas certain de cela. Cela fait longtemps que depuis que j'ai travaillé avec Log4J - Est-ce que quelqu'un a de bons conseils sur des difficultés à tirer sur ce type de problème?

PS: Il existe des instances de cette application qui sont déployées sur divers serveurs de test / qa / prod et de ces instances allez bien. C'est seul sur les postes de travail locaux que la journalisation semble échouer silencieusement.


Mise à jour: Cela semble donc être un problème de la manière dont l'application est déployée. J'ai changé le mode Classloader en "Dernier des parents" et je peux voir que le fichier log4j est au moins lu maintenant. Et la première action que j'essaie de déclencher un classnotfoundexception disant que org.apache.commons.logging.impl.log4jfactory est introuvable.


2e mise à jour: J'ai remarqué quelque chose d'étranger ... L'application dispose de deux projets de guerre - l'un d'entre eux est pour l'interface utilisateur et l'autre pour certains services Web. Le projet qui est pour l'UI est connecter avec succès ses opérations au fichier journal. Le projet de service Web est celui qui échoue avec le ClassNotFoundException . Tous deux ont des biens loggings de la communication répertoriés comme une dépendance de module Javae, et aucun d'entre eux n'a eu une configuration de journalisation spécifique au projet (tous les fichiers de configuration sont dans un projet de ressources).

Une différence majeure est que ce projet d'interface utilisateur comprend d'autres cadres internes (pré-compilés sous forme de pots) que pourrait incluent déjà les configurations de journalisation nécessaires et peut-être que c'est là que la différence est.

J'ai également essayé d'utiliser la réponse (un fichier nommé org.apache.commons.logging.logFactory dans les méta-inf / services avec une ligne contenant: "org.apache.commons.logging.impl.log4jfactory") de Cette question: WebSphere Tous les journaux vont à systemout.log mais cela ne semblait pas aider.


14 commentaires

Quel type d'instance Logger est-ce? Comme dans RollingfileAppender


@ Woot4MOO: C'est un fichier-fesses.


Pouvez-vous publier votre fichier de configuration? La configuration est-elle la même sur tous les environnements?


Quel est le système d'exploitation local versus prod / qa / test? L'emplacement est-il écritable localement comme déclaré dans le fichier de propriétés?


Est-ce que vous le construisez différemment localement, alors vous faites dans les autres environnements? Peut-être que c'est un problème d'IDE.


Si les paramètres de classe sont d'abord pour charger les classes parent (conteneur), cochez la case WebSphere des journaux pour voir si votre journalisation s'y révèle.


@ Woot4moo: AIX pour serveurs vs. WinXP pour mon poste de travail. L'emplacement cible est écritable et j'ai une application différente ici que fait écrit son journal dans ce répertoire.


Je commencerais à introduire une erreur dans le fichier de configuration LOG4J afin qu'elle explose lors de l'initialisation, juste pour valider que le fichier est en cours de lecture.


Écrivez le test unitaire le plus petit possible qui invoque une fonction qui fait référence à l'enregistreur. I.e. Void public Go () {LOGGER.DEBUG ("TEST"}; Est-ce que cela génère quelque chose dans la console Eclipse, telle que incapable de joindre un appendeur? Ou crache-t-il "Test"?


@Nathanhughes: Oui, cela pourrait être. Le déploiement local passe par RAD, les serveurs utilisent des fourmis et d'autres scripts.


@SoronThar: Bon appel. Les erreurs dans le fichier ne faisaient pas état d'erreurs lors du redémarrage / republier l'application.


@FrustratedwithFormsDesigner Log4j est notoire pour ne pas lire dans le fichier de configuration que vous pensez que c'est la lecture. (Ou plutôt, les applications mal écrits sont notoires pour abuser de log4j de cette façon.) Ce que je ferais est de placer des points d'arrêt dans les classes de configuration Log4J pour voir lequel est invoqué et où ils lent.


Excellent! Vous avez trouvé l'une des principales erreurs d'erreurs. Une solution rapide serait d'ajouter la journalisation des communes à votre application.


@SoronThar: J'ai ajouté communes-journalisation.jar à tous les projets comme une dépendance (ainsi que sur la buildpath) qui utilise la journalisation, mais dans certains cas, je reçois maintenant un ClasseNotFoundException pour org.apache.commons.logging.impl.log4jfactory .


6 Réponses :


11
votes

Voir cette réponse: Comment initialiser le log4J correctement?

-dlog4j.debug est très utile pour des problèmes tels que celui-ci


1 commentaires

Hmm je vais devoir jeter un coup d'œil à cela lundi.



0
votes

Je me rends compte que ce n'est pas votre même symptôme, mais il existe des problèmes connus avec Log4J si votre application (ou tout ce qu'elle utilise) utilise la journalisation des communes. Voir si Cette question / réponse est pertinente.


0 commentaires

2
votes

La chose la plus récente que j'ai changée qui a finalement eu la journalisation fonctionnant correctement modifiait le mode ClassLoader en "Parent_first" et la stratégie de classeur de guerre à "Application". La configuration par défaut initiale était "parent_first" / "module". Je l'ai changé à "Parent_last" / "Application" sur les conseils d'un collègue qui dit que la journalisation fonctionne correctement pour eux et c'est le seul changement qu'ils doivent faire lors de la création d'une nouvelle boîte à sable pour cette application. Je ne sais pas pourquoi je devais aller avec "parent_first" / "application", mais au moins cela fonctionne maintenant.


mise à jour:

J'ai essayé de mettre en place un nouvel espace de travail et j'ai eu le même problème. Il s'avère que vous avez besoin de "parent_first" / "application" et d'un fichier nommé org.apache.commons.logging.logging.logfactory dans les méta-inf / services avec une ligne contenant: "org.apache.commons.logging.impl.log4jfactory" . Ne pas avoir le fichier provoque l'échec de l'enregistrement (généralement avec un message indiquant qu'un log4j introuvable).


0 commentaires

0
votes

Ne pas capable de créer un fichier journal, j'ai utilisé le fichier logback.xml dans l'application Springservice et déployé dans WebSphere Server ... mais lorsque j'ai utilisé le fichier log4j.properties, il crée un fichier journal. J'ai donné une dépendance appropriée appropriée pour log4J et slf4j .. logback.xml fichier
xxx pré>

` p>

Dépendance: P>

<dependency>
    <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>${logback.version}</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>${logback.version}</version>
    </dependency>


0 commentaires

0
votes

J'ai eu un problème où Log4j n'était rien montrant dans l'un de mes projets. SÇi J'avais ajouté un espace de tête dans le nom de classe dans le fichier log4j2.xml. Log4J fait un dictionnaire de dictionnaire par nom de classe. Donc, tout espace de tête ou de fuite dans le nom de classe rendrait cette entrée particulière invalide.


0 commentaires

0
votes

Juste mes deux cents - j'avais quelque chose comme ça se produisant - mais dans mon cas, je pouvais voir certaines sorties de mes appels de journalisation. Il était évident que la configuration a été reprise d'ailleurs et celle que j'avais changée n'avait aucun impact.

Après avoir tourné -dlog4j.debug = true comme suggéré ici, il était évident que Log4J ramassait un fichier nommé log4j.xml situé dans le répertoire de travail de mon Tomcat. Soit c'était un reste d'autres choses que je faisais, soit il a été généré en quelque sorte à partir d'une certaine configuration log4j dans l'une de mes bibliothèques mal configurées.

Je n'ai pas pensé à effacer le contenu du répertoire de travail (aurait pu essayer .. [Modifier: J'ai essayé et ça n'a pas fonctionné]) - La seule chose que je pense que je devais transmettre une référence codée à mon fichier de propriétés via -dlog4j.configuration = log4j.properties (ne voulait pas utiliser le chemin absolu) (c'est arrivé que j'utilisais un fichier de propriétés et non un XML) - et cela fonctionnait.

[EDIT: Eh bien, cela n'a pas fonctionné pour la configuration du serveur. J'ai enfin trouvé ce qui n'allait pas - certaines bibliothèques cuits à la maison que j'avais incluses comme des pots dans mon projet, avaient leurs propres fichiers log4j.xml et log4j.properties, qui ont apparemment été lus / trouvés plus tôt que mon propre fichier de propriétés - la chose la plus droite était de supprimer ces fichiers de propriété redondants de JARS]


0 commentaires