Question

J'ai un EAR avec des structures telles que:

APP.ear 
- APP1.war
    - WEB-INF/classes/log4j.properties
- APP2.war
    - WEB-INF/classes/log4j.properties
- app1-ejb.jar
- app2-ejb.jar
- log4j.jar
- spring.jar
- commons-lang.jar (...and other jar)

Je veux que chaque guerre d'avoir leur propre journal d'application. Mais il semble que la configuration ci-dessus ne fonctionne pas. Connectez-vous pour APP1 et APP2 va dans le journal de APP1. Y at-il de toute façon à créer des journaux d'applications séparées?

Était-ce utile?

La solution

Il se trouve qu'il est impossible en raison de la classloader. La hiérarchie des classloader est comme:

Application classloader -> classloader Ejb -> classloader guerre

Pour avoir un journal de sepearte pour la guerre individuelle, on peut mettre log4j.jar dans la guerre et de laisser le log4j utilise le classloader de guerre. Mais comme les deux app1-ejb.jar et App2-ebj.jar doivent également utiliser log4j, le log4j.jar ne peut être placé au niveau supérieur. Ainsi, le log4j est au niveau de classloader application.

Je peux spécifier une seule configuration log4j pour ouvrir une session package différent de fichiers différents. Mais pour la bibliothèque commune, comme le printemps, le journal ne peut pas être sepearted.

Autres conseils

La raison pour laquelle cela n'a pas fonctionné parce que le log4j est présent à l'emplacement racine, au lieu que chacun guerre un log4j.jar dans son répertoire WEB-INF / lib et retirez le log4j.jar de la racine.

Pour plus d'informations sur ce consultez mon article de blog sur ce http://techcrawler.wordpress.com/

Vous pouvez aussi le faire en changeant dynamiquement la propriété du fichier dans le fichier de propriétés à l'aide du PropertyConfigurator dans le code.

Logback est une solution viable pour résoudre ce problème. Après avoir regarder autour de différents hacks pour faire ce travail avec log4j, nous avons décidé de passer à Logback. Je l'ai utilisé la configuration suivante avec pot Logback dans la webapp.

Un fichier Logback à l'intérieur de l'application Web qui comprennent un fichier externe:

    <?xml version="1.0" encoding="UTF-8" ?>
    <configuration scan="true" scanPeriod="10 seconds">
        <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
            <resetJUL>true</resetJUL>
        </contextListener>

        <contextName>${project.artifactId}</contextName>

        <jmxConfigurator />

        <include file="${logback.configuration.filepath}" />
    </configuration>

${logback.configuration.filepath} est remplacé lors du filtrage Maven par le chemin exact, extérieur à la webapp du fichier de configuration (quelque chose comme /opt/server/conf/loback.included.conf ).

Et puis, le contenu du logback.included.conf (ce fichier fait partie de la Projetct, livré avec build-helper:attach-artifact, donc ${project.artifactId} est également remplacé pendant le filtrage Maven):

    <?xml version="1.0" encoding="UTF-8" ?>
    <included>
        <appender name="file" class="ch.qos.logback.core.FileAppender">
            <file>/var/log/server/${project.artifactId}.log</file>
            <encoder>
                <pattern>[@/%contextName] %date{ISO8601} [%-5level] %thread:[%logger] %msg%n</pattern>
            </encoder>
        </appender>

        <root level="INFO">
            <appender-ref ref="file" />
        </root>
    </included>

Seule limitation, le contenu du fichier inclus doit être conforme à l'un des includer. Il suffit de l'écriture de règles en fait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top