Question

J'utilise log4j et il travaille très bien. Un fichier log4j.xml est dans mon classpath, j'utilise appender et la catégorie ... encore une fois, il est un travail très bien pour mon code ou code autre librairie.

Mais les classes de printemps continuent d'affluer stdout avec le message que je veux vous connecter ailleurs. Il est Beggin à anoying.

Message Offending: org.springframework.jms: une erreur .... De manière plus générale, toutes les classes du paquet org.springframework envoyer un message à stdout.

Alors je mets dans mon log4j.xml:

<appender name="JMS-ERROR" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="tms.logs.folder/tms.logs.files.prefix-jms-error.log"/>
    <param name="Append" value="true"/>
    <param name="MaxFileSize" value="1000KB"/>
    <param name="MaxBackupIndex" value="2"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="**DVIDEA** %d{dd.MM.yyyy HH:mm:ss} %c  %m%n"/>
    </layout>
    <filter class="org.apache.log4j.varia.LevelRangeFilter">
        <param name="LevelMin" value="DEBUG" />
        <param name="LevelMax" value="FATAL" />
    </filter>
</appender>


<category name="org.springframework.jms" additivity="false">
    <appender-ref ref="JMS-ERROR"/>
</category>

Il est un travail avec d'autres librairie. Pourquoi ne pas le printemps?

Je fais des recherches, et il est appeart qui utilisent Spring-logging commun, et non log4j. Il est possible qu'une cause? Toute solution de contournement?

J'essayer d'ajouter un log4jConfigurationListener à mon web.xml. il travaille mais je ne Stil aucun contrôle sur le message d'erreur de printemps.

<context-param>
   <param-name>log4jConfigLocation</param-name>
   <param-value>classpath:log4j.xml</param-value>
</context-param>
<context-param>
   <param-name>log4jRefreshInterval</param-name>
   <param-value>10000</param-value>
</context-param>
<listener>
   <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

Edit:

Un peu plus d'info:

  • i utilise Tomcat 5.5
  • une log4j.property (ancienne configuration log4j) est toujours présente pour des raisons historiques. I'v essayer de l'enlever => pas de changement.

EDIT 2: J'utilise la solution suivante, mais je ne suis pas satisfait: il n'est pas configurable

java.util.logging.Logger springLogger = Logger.getLogger("org.springframework.jms");
springLogger.setLevel(Level.OFF);

Pas de solution correcte

Autres conseils

Notez que dans les échantillons de printemps qu'ils utilisent slf4j aux messages du journal de route de Commons Logging log4j. Dans pom.xml Maven, il semble ainsi:

<!-- Exclude Commons Logging -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>org.springframework.context</artifactId>
    <version>${spring.version}</version>
    <exclusions>
        <!-- Exclude Commons Logging in favor of SLF4j -->
        <exclusion>
            <groupId>org.apache.commons</groupId>
            <artifactId>com.springsource.org.apache.commons.logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- Add slf4j API -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>com.springsource.slf4j.api</artifactId>
    <version>${slf4j.version}</version>
</dependency>

<!-- Add Commons Logging -> slf4j bridge -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>com.springsource.slf4j.org.apache.commons.logging</artifactId>
    <version>${slf4j.version}</version>
    <scope>runtime</scope>
</dependency>

<!-- Add slf4j -> log4j bridge -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>com.springsource.slf4j.log4j</artifactId>
    <version>${slf4j.version}</version>
    <scope>runtime</scope>
</dependency>

Vous pourriez avoir besoin:

<bean id="log4jInitialization"
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetClass"
            value="org.springframework.util.Log4jConfigurer" />
        <property name="targetMethod" value="initLogging" />
        <property name="arguments">
            <list>
                <value>conf/log4j.xml</value>
            </list>
        </property>
    </bean>

Spring utilise Apache Commons Logging, qui à son tour décide d'utiliser STDOUT (via java.util.logging) ou Log4j. Si vous obtenez la sortie de printemps sur STDOUT, puis commons-logging n'a pas situé log4j pour une raison quelconque.

Si vous définissez la propriété système org.apache.commons.logging.diagnostics.dest, peut être configuré commons-logging pour connecter ses diagnostics, vous indiquant les mesures qu'il prend pour déterminer dans log4j est présent.

Donc, dans votre script de démarrage de tomcat, définissez la propriété du système, par exemple.

-Dorg.apache.commons.logging.diagnostics.dest=STDOUT

Vous devez utiliser SLF4J et inclure le pont à la plate-forme d'enregistrement que vous voulez (log4j), mais vous devez aussi exclure commons-logging de tous les autres endroits, il peut être tiré. Il aide à ont un IDE pour ce faire, ou vous pouvez mettre une entrée factice dans des commons-logging. Pour plus de détails à ce sujet, voir le SLF4J entrée FAQ

Une réponse précédente mentionné à l'aide des artefacts com.springsource, si vous utilisez Maven Central la bonne façon de le faire est la suivante:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.10</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.10</version>
</dependency>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top