Onde eu configuro o log4j em uma classe de teste JUnit?

85

Olhando para o último caso de teste JUnit que escrevi, chamei o método BasicConfigurator.configure () do log4j dentro do construtor de classe. Isso funcionou bem para executar apenas aquela única classe do comando "executar como caso de teste JUnit" do Eclipse. Mas percebo que está incorreto: tenho quase certeza de que nosso conjunto de testes principal executa todas essas classes de um processo e, portanto, a configuração do log4j deve estar acontecendo em algum lugar mais acima.

Mas eu ainda preciso executar um caso de teste sozinho algumas vezes, caso em que quero log4j configurado. Onde devo colocar a chamada de configuração para que seja executada quando o caso de teste é executado de forma autônoma, mas não quando o caso de teste é executado como parte de um conjunto maior?

skiphoppy
fonte
Vou assumir log4j 1.x aqui, não 2 ...
rogerdpack de

Respostas:

51

A LogManagerclasse determina qual configuração log4j usar em um bloco estático que é executado quando a classe é carregada. Existem três opções destinadas aos usuários finais:

  1. Se você especificar log4j.defaultInitOverridecomo false, ele não configurará log4j de forma alguma.
  2. Especifique o caminho para o arquivo de configuração manualmente e substitua a pesquisa de caminho de classe. Você pode especificar a localização do arquivo de configuração diretamente usando o seguinte argumento para java:

    -Dlog4j.configuration=<path to properties file>

    na configuração do executor de teste.

  3. Permita que log4j varra o classpath para um arquivo de configuração log4j durante seu teste. (o padrão)

Veja também a documentação online .

Paul Morie
fonte
Como ele saberá que é um "arquivo de configuração log4j?" Qual é o nome do arquivo? (log4j.xml?)
Chad
1
@Chad: Eu editei minha resposta para responder à sua pergunta. Consulte o link para o bloco estático para ver exatamente como isso é implementado.
Paul Morie
Estou usando log4j2 e eu tive que usar a seguinte configuração para indicar um arquivo: -Dlog4j.configurationFile=log4j2.xml. Além disso, se você está tentando carregar debug / arranque, esta definição pode ser útil: -Dlog4j2.debug=true.
Kent
Alguma maneira de ser um pouco mais específico nessa resposta?
markthegrea de
61

Geralmente, coloco um arquivo log4j.xml em src / test / resources e deixo o log4j localizá-lo por conta própria: nenhum código é necessário, a inicialização padrão do log4j o pegará. (Eu normalmente quero definir meus próprios registradores para 'DEBUG' de qualquer maneira)

araqnid
fonte
6
Para testes de construção padrão, eu definiria Log4j para aviso ou até mesmo erro. Se os testes forem bem-sucedidos (também testes negativos), não deve haver registro, o que chama a atenção do usuário.
keiki de
2
Sim, isso é certo para log4j 1.x. Para log4j2, aparentemente, você pode usar arquivos mais "exóticos" como o arquivo log4j2-test.properties ... logging.apache.org/log4j/2.x/manual/configuration.html :)
rogerdpack
6

Você pode querer dar uma olhada em Simple Logging Facade for Java (SLF4J) . É uma fachada que envolve Log4j que não requer uma chamada de configuração inicial como Log4j. Também é bastante fácil trocar Log4j por Slf4j, pois as diferenças de API são mínimas.

James McMahon
fonte
5

Eu uso as propriedades do sistema em log4j.xml:

...
<param name="File" value="${catalina.home}/logs/root.log"/>
...

e comece os testes com:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.16</version>
    <configuration>
        <systemProperties>
            <property>
                <name>catalina.home</name>
                <value>${project.build.directory}</value>
            </property>
        </systemProperties>
    </configuration>
</plugin>
Gavenkoa
fonte