Pergunta

Eu uso log4j e ele trabalha muito bem. Um arquivo log4j.xml está no meu caminho de classe, eu uso o Appender e a categoria ... Novamente, é um trabalho muito bom para o meu código ou código de outros liberairy.

Mas as aulas de primavera continuam a inundar o stdout com a mensagem que quero fazer login em outro lugar. É implorativo ser uma afinação.

Mensagem ofensiva: org.springframework.jms: algum erro .... mais geralmente, todas as classes do pacote org.springframework enviam mensagem para stdout.

Então eu coloquei isso no meu 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>

É um trabalho com outra Librairie. Por que não primavera?

Eu faço algumas pesquisas, e é parecer que a primavera usa o registro comum, e não o LOG4J. É uma causa possível? Alguma solução alternativa?

Eu tentei adicionar um log4jconfigurationlistener ao meu web.xml. Ele está trabalhando, mas eu não tenho nenhum controle sobre a mensagem de erro da primavera.

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

Editar:

Mais algumas informações:

  • eu uso o tomcat 5.5
  • Um log4j.property (antigo log4j config) ainda está presente por razão histórica. Vou tentar removê -lo => sem alteração.

Edit 2: eu uso a seguinte solução alternativa, mas não estou feliz com isso: não é configurável

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

Nenhuma solução correta

Outras dicas

Observe que nas amostras de mola, eles estão usando SLF4J para rotear mensagens de log do log do Commons para Log4J. Em Maven's pom.xml parece assim:

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

Você pode precisar:

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

A primavera usa o registro do Apache Commons, que por sua vez decide usar o stdout (via java.util.logging) ou log4j. Se você está obtendo saída de mola no stdout, o Logging do Commons não localizou o LOG4J por algum motivo.

Se você definir a propriedade do sistema org.apache.commons.logging.diagnostics.dest, Logging do Commons pode ser configurado para registrar seus diagnósticos, informando quais etapas estão tomando para determinar no log4j está presente.

Então, em seu script de inicialização do Tomcat, defina a propriedade do sistema, por exemplo,

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

Você deve usar o SLF4J e incluir a ponte para a plataforma de madeira desejar (log4j), mas você deve também Exclua o lançamento do Commons de todos os outros lugares em que pode ser puxado. Ajuda a ter um IDE para fazer isso, ou você pode colocar uma entrada fictícia para o Commons-Logging. Para detalhes sobre isso, consulte o Entrada de perguntas frequentes do SLF4J

Uma resposta anterior mencionada usando os artefatos com.springsource, no entanto, se você estiver usando o Maven Central, a maneira certa de fazê -lo é:

<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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top