Configuração Log4j2 - Nenhum arquivo de configuração log4j2 encontrado


91

Recentemente, decidi aprender a usar o logger log4j2. Baixei os arquivos jar necessários, criei uma biblioteca, um arquivo de configuração xml e tentei usá-lo. Infelizmente, recebo esta declaração no console (Eclipse):

ERROR StatusLogger No log4j2 configuration file found. Using default configuration:       logging only errors to the console.

Este é o meu código de aula de teste:

package log4j.test;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4jTest
{
    static final Logger logger = LogManager.getLogger(Logger.class.getName());

    public static void main(String[] args) {    
        logger.trace("trace");
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
        logger.fatal("fatal");
    }
}

E meu arquivo de configuração xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration package="log4j.test" 
               status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="log4j.test.Log4jTest" level="trace">
            <AppenderRef ref="Console"/>
        </Logger>
        <Root level="trace">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

Eu tentei também com xml sem <Logger>tags e especificação de pacote e em várias pastas / diretórios de pacotes, mas não ajudou. Agora meu log4j2.xmlarquivo está localizado diretamente na pasta do projeto no eclipse.


2
O doutor disse, só tem que estar no caminho de classe. É isso?
Fildor de

sim, eu perdi. Desculpe pela pergunta estúpida e obrigado :)
Qbisiek

Respostas:


139

Este é um projeto Java Eclipse simples, sem maven etc? Nesse caso, você precisará colocar o log4j2.xmlarquivo em uma srcpasta para poder encontrá-lo no caminho de classe. Se você usar maven, coloque-o sob src/main/resourcesousrc/test/resources


4
Meu heroi! Eu tinha o arquivo de configuração no classpath (eu acho), mas não estava na pasta src. Mudei para lá e está funcionando agora!
Shadoninja

como é configurar com um projeto maven? (como o jeito maven, porque suponho que se eu colocasse um 'log4j2.xml' no caminho de classe, eu funcionaria), obrigado pelas dicas :)
Enrique San Martín

log4j2.xml está no meu src (Projeto JavaFX sem maven) mas não foi encontrado .. isso é muuuuito complicado?!?! :(
Ewoks

2
Para sbto log4j2.xmlentra src/main/resourcestambém.
Akavall

Não consigo encontrar este arquivo log4j2.xml
Karthiga

32

Você precisa escolher uma das seguintes soluções:

  1. Coloque o arquivo log4j2.xml no diretório de recursos em seu projeto para que o log4j localize os arquivos no caminho da classe.
  2. Use a propriedade do sistema -Dlog4j.configurationFile = file: /path/to/file/log4j2.xml

1
-Dlog4j.configurationFileera o que eu precisava, já que o projeto no qual estou trabalhando não é baseado no Maven. Incrível
Kimchi Man

15

Estava seguindo as documentações - Apache Log4j2 Configuratoin e Apache Log4j2 Maven na configuração de log4j2 com yaml. De acordo com a documentação, as seguintes dependências do maven são necessárias:

  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.8.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.8.1</version>
  </dependency>

e

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.8.6</version>
</dependency>

Apenas adicionar estes não pegava a configuração e sempre dava erro. A forma de depurar a configuração adicionando -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACEajudou na visualização dos logs. Mais tarde, tive que baixar o código-fonte usando Maven e a depuração ajudou a entender as classes dependentes do log4j2. Eles estão listados em org.apache.logging.log4j.core.config.yaml.YamlConfigurationFactory:

com.fasterxml.jackson.databind.ObjectMapper
com.fasterxml.jackson.databind.JsonNode
com.fasterxml.jackson.core.JsonParser
com.fasterxml.jackson.dataformat.yaml.YAMLFactory

Adicionar mapeamento de dependência para jackson-dataformat-yamlnão terá as duas primeiras classes. Portanto, adicione a jackson-databinddependência para fazer a configuração do yaml funcionar:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.6</version>
</dependency>

Você pode adicionar a versão referindo-se à Test Dependenciesseção do log4j-apiitem de versão do Repositório MVN . Por exemplo, para a versão 2.8.1 do log4j-api, consulte este link e localize a jackson-databindversão.

Além disso, você pode usar o código Java abaixo para verificar se as classes estão disponíveis no classpath:

System.out.println(ClassLoader.getSystemResource("log4j2.yml")); //Check if file is available in CP
ClassLoader cl = Thread.currentThread().getContextClassLoader(); //Code as in log4j2 API. Version: 2.8.1
 String [] classes = {"com.fasterxml.jackson.databind.ObjectMapper",
 "com.fasterxml.jackson.databind.JsonNode",
 "com.fasterxml.jackson.core.JsonParser",
 "com.fasterxml.jackson.dataformat.yaml.YAMLFactory"};

 for(String className : classes) {
     cl.loadClass(className);
 }

4

Além do que Tomasz W escreveu, ao iniciar seu aplicativo você pode usar as configurações:

-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE 

para obter a maioria dos problemas de configuração.

Para obter detalhes, consulte as perguntas frequentes do Log4j2: Como depuro minha configuração?


3

O Eclipse nunca verá um arquivo até que você force uma atualização do IDE. É um recurso! Portanto, você pode colocar o arquivo em todo o projeto e o Eclipse irá ignorá-lo completamente e lançar esses erros. Clique em atualizar na visualização do projeto Eclipse e então funciona.


0

No meu caso, eu tive que colocá-lo na pasta bin do meu projeto, mesmo o fato de que meu classpath está definido para a pasta src. Não tenho ideia do porquê, mas vale a pena tentar.


Isso sugere que o projeto não reconhece que a pasta que contém sua configuração é uma pasta de recursos, portanto, ele não copia o arquivo automaticamente como parte da construção. Eu sugiro que você analise isso mais a fundo, porque eventualmente você fará uma alteração na fonte que não será copiada para a pasta de lixo e acabará se perguntando por que sua alteração não funcionou.
Sarah Phillips
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.