La spécification de Log4j2 Fichier de Configuration en Utilisant l'Exécutable JAR
J'ai de la difficulté en précisant le Log4j2 fichier de configuration de l'emplacement lors de l'utilisation d'un fichier JAR exécutable. Il fonctionne très bien si je m'en sépare tous les Pots, mais quand j'essaie de les combiner en un seul fichier JAR exécutable, pour une raison quelconque, le log4j2.xml
fichier n'est pas ramassés à partir de la ligne de commande.
J'ai essayé ces deux méthodes de spécification de l'emplacement:
java -Djava.libary.path=..\bin -cp ..\config -jar MyApplication.jar
java -Djava.libary.path=..\bin -Dlog4j.configurationFile=..\config\log4j2.xml -jar MyApplication.jar
Ni de ceux qui travaillent. J'ai aussi essayé d'ajouter le répertoire contenant le fichier de configuration dans le classpath dans le BOCAL du fichier manifeste:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.2
Created-By: 1.7.0_21-b11 (Oracle Corporation)
Main-Class: com.abc.MyApplication
Class-Path: ../config/
Je n'ai pas eu du succès avec cette méthode. Les idées de ce que je fais de mal?
Merci d'avance pour toute aide!
MODIFIER
Ah, je crois que j'ai confondu le problème. À l'origine, c'était l'erreur, j'ai vu dans la ligne de commande de sortie:
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
Mais à un certain point, alors que j'étais en train de changer les choses, le message d'erreur a changé sans que je m'en rende compte:
ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
Donc ce que j'ai compris c'est que même si l'exécutable JAR j'étais bâtiment a été notamment le log4j-core-2.1.jar
et log4j-api-2.1.jar
Pots à l'intérieur et à l' MANIFEST
du fichier classpath, il y avait un problème. La façon dont j'ai écrit mon ant fichier de combiner les bibliothèques dans le seul BOCAL j'ai été la création a été réussi à copier les répertoires et les fichiers de classe, mais n'était pas de copier sur les autres types, pour certaines raisons, qui sont bien évidemment nécessaires (par exemple, Log4j-config.xsd, Log4j-événements.dtd, etc.).
Pour résoudre ce problème, j'ai changé la façon dont j'ai été la fusion des Pots dans mon fichier Ant:
<jar destfile="${dist}/${jarName}" basedir="${classes}"
excludes=".svn">
<!-- Merge this JAR with all the JARs in the lib directory, so that
we are only creating one distribution JAR that includes all the
libraries that you need. -->
<fileset dir="${classes}" includes="**/*.class" />
<zipgroupfileset dir="${lib}" includes="**/*.jar" />
<!-- Specify the manifest file of the JAR -->
<manifest>
<attribute name="Main-Class" value="com.abc.MyApplication"/>
<attribute name="Class-Path" value=". ${manifest.classpath}"/>
</manifest>
</jar>
Et qui a résolu le problème et copié tous les fichiers dans les Bocaux dans mes nouvellement créé JAR.
Une fois ce problème a été résolu, le deuxième des commandes que j'ai posté ci-dessus a travaillé pour spécifier l'emplacement du fichier de configuration. (Comme indiqué par @rewolf
ci-dessous, la première commande ne fonctionne pas parce que le chemin spécifié dans le MANIFEST
du POT remplace toute classpath spécifié sur la ligne de commande.
Merci pour vos réponses, elles m'a vraiment aidé à obtenir sur la bonne voie de trouver mes erreurs.
Non, j'ai pensé qu'il était préférable de garder le fichier de configuration à l'extérieur du POT, de sorte que l'utilisateur peut modifier les configurations s'ils le souhaitent. Dois-je inclure le fichier dans le POT?
Comment voulez-vous créer votre seul bocal? Le log4j2-core pot contient des fichiers de configuration qui DOIT être inclus ou log4j2 ne fonctionnera pas correctement.
S'il vous plaît ajouter la sortie que vous recevez de log4j. J'ai été en supposant que c'est le statut par défaut de l'enregistreur de se plaindre d'aucun fichier de config - mais il pourrait avoir été une erreur de supposer donc
OriginalL'auteur Steph | 2015-02-18
Vous devez vous connecter pour publier un commentaire.
Quelque chose qui ne s'explique pas très bien/bien évidemment dans la documentation de Java est que si vous utilisez un fichier exécutable Jar, le Chemin de Classe, comme spécifié dans le fichier de Manifeste. Il ne sera pas écouter la
-cp
ou--classpath
arguments.-Dlog4j.configurationFile=directory/file.xml
devrait fonctionner. Je suis en supposant que vous êtes en cours d'exécution sur Windows, compte tenu de votre barre oblique direction. Êtes-vous sûr que vous l'exécutez à partir de la corriger par rapport répertoire?
Mise à jour
Je l'ai juste essayé sous Windows sans aucun problème. J'ai utilisé le manifeste suivantes:
La Log4j2 pots sont situés dans un
lib/
répertoire et lelog4j2.xml
est dans leconf/
répertoire. J'ai exécuté la commande suivante, et elle a trouvé la config avec succès.OriginalL'auteur rewolf
J'ai résolu le problème de la spécification de l'emplacement de log4j2 de configuration dans un runnable Jar que j'ai créé à partir d'Eclipse en incluant dans mon code java:
J'ai un paquet et j'ai donc besoin de spécifier le chemin d'accès à mon "ressources" du dossier (dans mon "src" dans le dossier Eclipse):
Avis je ne comprend pas "src" dans mon chemin et je pense que c'est le chemin d'accès dans le "bin" du dossier qui est nécessaire: c'est à dire dans mon cas "com/company/app/resources/log4j2.xml"
Mon fichier de configuration ressemble à ceci:
Également remarquer que je l'attribuer dynamiquement les rolling chemin du fichier journal + nom "${sys:logFilename}" en incluant dans mon code java:
Afin d'obtenir ces 2 dynamique du Système.setProperty affectations de travail dont ils ont besoin pour s'exécuter avant le "getLogger" déclaration et donc mon code java ressemble:
}
Avoir "logger", a déclaré au début de ma classe (mais sans invoquer "getLogger" avant mes 2 Système.setProperty consolidés) me permet d'référence "logger" dans d'autres méthodes. Je suis obligé de réagir et si bien que j'ai choisi "null" puis, plus tard, de le mettre à jour avec le "getLogger" déclaration - compte tenu de cela, je ne peux pas le faire "final" (ne peut attribuer qu'une fois), mais vous pouvez le rendre statique - une constante variable de classe.
nb 2 log4j2 pots j'ai inclus dans le build path:
log4j-api-2.6.2.jar
log4j-core-2.6.2.jar
OriginalL'auteur David Miller
Pour d'autres personnes qui ont ce problème...
Donc si vous avez un log4j2.xml dans votre dossier de programme pour votre exampleApp dans
C:\Program Files\ExampleApp
alors......doivent travailler
OriginalL'auteur kervin
J'ai eu ce problème avec la version 2.8 de Log4j2.
Cela a disparu lorsque les Log4j2 pots ont été remplacés par la version 2.6 de Log4j2.
OriginalL'auteur sujeet suryawanshi