web-dev-qa-db-pt.com

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

Ultimamente decidi aprender a usar o log4j2 logger. Eu fiz o download dos arquivos jar necessários, criei a biblioteca, o arquivo de configuração xml e tentei usá-lo. Infelizmente eu 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 classe 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ários diretórios de pastas/pacotes, mas não ajudou. Agora meu arquivo log4j2.xml está localizado diretamente na pasta do projeto no Eclipse.

71
Qbisiek

Este é um projeto Java simples do Eclipse sem o maven etc? Nesse caso, você precisará colocar o arquivo log4j2.xml na pasta src para poder encontrá-lo no classpath. Se você usar o maven, coloque-o sob src/main/resources ou src/test/resources

125
Tomasz W

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
26
Abdulghaffar Al-Labadi

Estava seguindo as documentações - Apache Log4j2 Configuratoin e Apache Log4j2 Maven em configurando log4j2 com yaml. Conforme 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 adicionando estes não escolheu a configuração e sempre deu erro. O caminho da configuração debugging adicionando -Dorg.Apache.logging.log4j.simplelog.StatusLogger.level=TRACE ajudou a ver os logs. Mais tarde, teve que baixar a fonte usando Maven e depuração ajudou a entender as classes dependentes de 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-yaml não terá as duas primeiras classes. Portanto, adicione a dependência jackson-databind para que a configuração do yaml funcione:

<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 à seção Test Dependencies do item de versão log4j-api do MVN Repository . Por exemplo. para a versão 2.8.1 do log4j-api, consulte este link e localize a versão jackson-databind.

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

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);
 }
10
James Jithin

O Eclipse nunca verá um arquivo até você forçar uma atualização do IDE. É uma característica! Então 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, em seguida, ele funciona. 

3
Mike Ashby

Além do que Tomasz W escreveu, iniciando sua aplicação você poderia usar as configurações:

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

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

Para detalhes, consulte Log4j2 FAQ: Como depurar minha configuração?

3

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

0
Florian