Nenhum anexo foi encontrado para o logger (log4j)?


369

Coloquei o log4j no meu caminho de construção, mas recebo a seguinte mensagem quando executo meu aplicativo:

log4j:WARN No appenders could be found for logger (dao.hsqlmanager).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

O que esses avisos significam? Qual é o appender aqui?


5
Isso parece ser um aviso de tempo de execução. Você tem certeza de que vê isso quando compila?
maba 21/09/12

5
Você tentou visitar o URL na última linha dos avisos?
Jesper

4
sim!!! mas não diz muito ... Descobri que preciso de um arquivo de propriedades para configurar meu appender!
Maximus

Edite manualmente os arquivos de configuração para adicionar o appender. Verifique se você possui o documento de configuração correto e válido.
Roman C

Respostas:


464

Esta breve introdução ao log4j guia é um pouco antiga, mas ainda é válida.

Esse guia fornecerá algumas informações sobre como usar registradores e anexos.


Para começar, você tem duas abordagens simples que você pode adotar.

O primeiro é apenas adicionar esta linha ao seu método principal:

BasicConfigurator.configure();

A segunda abordagem é adicionar esse log4j.propertiesarquivo padrão (extraído do guia mencionado acima) ao seu caminho de classe:

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

3
Apenas o primeiro passo está ok. Citação de breve introdução ao guia log4j
ray6080

65
Para novos tropeços ... inclua o arquivo log4j.properties em src / main / resources e isso pressupõe que você tenha um projeto maven. As coisas em src / main / resources estão incluídas no caminho de classe.
Keni 02/03

3
Na configuração do módulo de ideia do IntelliJ, selecione sua pasta de recursos e clique em recursos, ele adicionará automaticamente todos os seus recursos ao caminho de classe.
Waqas

11
Não ajudou. Eu uso o Eclipse Neon para C ++, e eu coloquei as log4j.properties ao lado do executável eclipse e não ajudou
Nadav B

log4j.rootLogger=DEBUG, A1é a linha que eu estava perdendo o tempo todo.
Mohammad Faisal

74

Parece que você precisa adicionar o local do seu log4j.propertiesarquivo ao Caminho de Classe no Eclipse.

Verifique se o seu projeto está aberto no Eclipse, clique no menu "Executar" na parte superior do Eclipse e clique no seguinte:

  1. Corre
  2. Executar configurações
  3. Caminho de classe (guia)
  4. Entradas do usuário
  5. Avançado (botão à direita)
  6. Adicionar pastas
  7. navegue até a pasta que contém seu arquivo log4j.properties
  8. Aplique
  9. Corre

A mensagem de erro não deve mais aparecer.


As mensagens de advertência não estão aparecendo agora, mas ainda os registos não estão escritos no local desejado
Arpan Saini

48

Solução rápida:

  1. adicione código à função principal :

    String log4jConfPath = "/path/to/log4j.properties";
    PropertyConfigurator.configure(log4jConfPath);
  2. crie um arquivo chamado log4j.properties em / path / to

    log4j.rootLogger=INFO, stdout
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n

Coloque o arquivo log4j.properties dentro do diretório de recursos, como src / test / resource
Alok

Para evitar declaração explícita do caminho log4j.properties; coloque-o na pasta do projeto e acesse-o como String log4jConfPath = System.getProperty ("user.dir") + File.separator + "log4j.properties";
Amimo Benja 17/06/19

36

Este é apenas um aviso.

Fixação

Isso ocorre quando os arquivos de configuração padrão log4j.propertiese log4j.xmlnão podem ser encontrados e o aplicativo não executa nenhuma configuração explícita.

Para corrigir isso, basta criar / copiar log4j.propertiesou log4j.xmlno seu local no caminho de classe (geralmente o mesmo que os arquivos jar).

Opção java opcionalmente definido: -Dlog4j.configuration=file:///path/to/log4j.properties.

log4jusa Thread.getContextClassLoader().getResource()para localizar os arquivos de configuração padrão e não verifica diretamente o sistema de arquivos. Conhecer o local apropriado para colocar log4j.propertiesou log4j.xmlrequer entender a estratégia de pesquisa do carregador de classes em uso. log4jnão fornece uma configuração padrão, pois a saída para o console ou para o sistema de arquivos pode ser proibida em alguns ambientes.

Depuração

Para depuração, você pode tentar usar o -Dlog4j.debug=trueparâmetro

Configuração de log4j.properties

Exemplo de configuração de log4j.properties:

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

# Print only messages of level WARN or above in the package com.foo.
log4j.logger.com.foo=WARN

Aqui está outro arquivo de configuração que usa vários anexadores:

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

Apache Solr

Se estiver usando o Solr , copie <solr>/example/resources/log4j.propertiespara um local no caminho de classe .

A configuração de amostra log4j.propertiesdo Solr é como:

#  Logging level
solr.log=logs/
log4j.rootLogger=INFO, file, CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n

#- size rotation with log cleanup.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=4MB
log4j.appender.file.MaxBackupIndex=9

#- File to log to and log format
log4j.appender.file.File=${solr.log}/solr.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n

log4j.logger.org.apache.zookeeper=WARN
log4j.logger.org.apache.hadoop=WARN

# set to INFO to enable infostream log messages
log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF

Veja também:


13

A maioria das respostas aqui sugeriu que o log4j.propertiesarquivo fosse colocado no local correto (para o projeto maven, ele deve estar localizado em src/main/resources)

Mas para mim, o problema é que o meu log4j.propertiesnão está configurado corretamente. Aqui está um exemplo que funciona para mim. Você pode experimentá-lo primeiro.

# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

11
O fato de o log4j considerar "não é possível encontrar o arquivo" e "especificação incompleta no arquivo" como o mesmo erro é uma perda de tempo.
Ed Norris

11
Para mim, esta é a melhor resposta. Votei e adicionei algumas explicações na sua resposta.
19418 schlebe

A melhor resposta para mim !!!
nosequeweaponer 19/02

8

Como explicado anteriormente, existem 2 abordagens

O primeiro é apenas adicionar esta linha ao seu método principal:

BasicConfigurator.configure();

A segunda abordagem é adicionar esse arquivo log4j.properties padrão ao seu caminho de classe:

Ao adotar a segunda abordagem, você precisa inicializar o arquivo corretamente, por exemplo.

Properties props = new Properties();
props.load(new FileInputStream("log4j property file path"));
props.setProperty("log4j.appender.File.File", "Folder where you want to store log files/" + "File Name");

Certifique-se de criar a pasta necessária para armazenar arquivos de log.


Eu estava tendo o mesmo problema e usei BasicConfigurator.configure (); no método principal e agora o código está sendo executado corretamente.
Surabhi Pandey

7

Você usa o Loggerno seu código para registrar uma mensagem. O Appenderobjeto é anexado a Loggerpara gravar a mensagem em um destino específico. Existem FileAppenderpara gravar em arquivos de texto ou ConsoleAppenderpara gravar no console. Você precisa mostrar seu código da instalação do Logger e Appender para obter mais ajuda.

leia o tutorial para entender melhor a interação do Logger e do Appender.


6

Verifique se o arquivo de propriedades foi definido corretamente. E, novamente, parece que o compilador não consegue encontrar o arquivo de propriedades, você pode definir como segue no pom (somente quando você usa o projeto maven).

<build>
       <sourceDirectory> src/main/java</sourceDirectory>
       <testSourceDirectory> src/test/java</testSourceDirectory>
        <resources>
             <resource>
                  <directory>resources</directory>
             </resource>
        </resources>           
</build >

Este! Passei horas para encontrar uma resposta. Meu código de caso funciona bem no Linux, mas tem esse erro no Windows (o mesmo NB IDE) e todas as soluções acima não funcionam!
Tiana987642

5

Eu recebo o mesmo erro. Aqui está o problema que leva a essa mensagem de erro:

Crio alguns objetos que usam o Logger antes de configurar o log4j:

Logger.getLogger(Lang.class.getName()).debug("Loading language: " + filename);

Solução: configure o log4j no início no método principal:

PropertyConfigurator.configure(xmlLog4JConfigFile); 
// or BasicConfigurator.configure(); if you dont have a config file

Muito obrigado!!! Todo mundo está assumindo o Spring ou o Tomcat, ou o que quer que seja para inicializar a configuração.
Windgazer


3

Outra razão pela qual isso pode acontecer (no RCP4) é que você está usando várias estruturas de log no seu arquivo de destino. Como exemplo, isso ocorrerá se você usar uma combinação de slf4j, log4j e ch.qos.logback.slf4j na guia de conteúdo dos arquivos de destino.


3

Adicione o seguinte como o primeiro código:

Properties prop = new Properties();
prop.setProperty("log4j.rootLogger", "WARN");
PropertyConfigurator.configure(prop);

2

No meu caso, o erro foi a bandeira " aditividade ". Se for "falso" para o seu pacote de projeto raiz, os pacotes filhos não terão um appender e você verá o erro " appender not found ".


2

Eu enfrentei o mesmo problema ao tentar executar a classe de teste JUnit.

O problema foi resolvido depois que adicionei manualmente o arquivo log4j.properties na pasta src / test / resources.

A adição do código abaixo ao arquivo log4j.properties resolveu o problema:

# Root logger option
log4j.rootLogger=INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\logging.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

1

Eu me deparei com esse problema ao tentar criar um jar executável com o maven no intellij 12. Aconteceu que, como o arquivo manifest do java não incluía um caminho de classe, o arquivo de propriedades log4j não pôde ser encontrado no nível raiz (onde o arquivo O arquivo jar foi executado a partir de.)

Para sua informação, eu estava obtendo o logger assim:

Logger log = LogManager.getLogger(MyClassIWantedToLogFrom.class);

E pude fazê-lo funcionar com um arquivo pom que incluía isso:

         <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2-beta-5</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath> 
                        <mainClass>com.mycompany.mainPackage.mainClass</mainClass>
                    </manifest>
                    <manifestEntries>
                        <Class-Path>.</Class-Path> <!-- need to add current directory to classpath properties files can be found -->
                    </manifestEntries>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

1

Verifique se o seu projeto está aberto no Eclipse, clique no menu "Executar" na parte superior do Eclipse e clique no seguinte:

  1. Corre

  2. Executar configurações

  3. Caminho de classe (guia)

  4. Entradas do usuário

  5. adicione jar à direita

  6. adicionar arquivo jar log4j

  7. Aplique

  8. Corre

A mensagem de erro não deve mais aparecer.


1

O motivo pode ser a falta da palavra staticem alguns:

final static Logger logging = Logger.getLogger(ProcessorTest.class);

Se eu tornar o registrador o campo da instância, estou recebendo exatamente este aviso:

No appenders could be found for logger (org.apache.kafka.producer.Sender)

O que é pior, o aviso não aponta para ProcessorTestonde o erro está, mas para uma classe absolutamente diferente (Remetente) como fonte de problemas. Essa classe tem o conjunto correto de criador de logs e não precisa de alterações! Poderíamos procurar o problema há séculos!


1

Eu enfrentei o mesmo problema ao usar o log4j2. Meu problema é causado pelo uso de biblioteca dependente incorreta:

<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <scope>runtime</scope>
    </dependency>

Em vez disso, devo usar:

<dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <scope>runtime</scope>
    </dependency>

No meu caso, tenho um log4j2.xml definido no meu diretório "resources" e especificado para usá-lo por:

System.setProperty("log4j.configurationFile", "log4j2.xml");

1

O Log4J exibe esta mensagem de aviso quando o código Java do Log4j está pesquisando para criar uma primeira linha de log no seu programa.

Neste momento, o Log4j faz 2 coisas

  1. pesquisar para encontrar o log4j.propertiesarquivo
  2. ele procura instanciar o apelido definir em log4j.properties

Se log4Jnão encontrar o log4j.propertiesarquivo ou se o aplicativo declarado em log4j.rootloggernão estiver definido em outro lugar no log4j.propertiesarquivo, a mensagem de aviso será exibida.

CUIDADO: o conteúdo do arquivo Propriedades deve estar correto.

O conteúdo a seguir NÃO está correto

log4j.rootLogger=file

log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=c:/Trace/MsgStackLogging.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%m%n
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=false

porque o fileappender é declarado em LOWER-CASE na log4j.rootloggerinstrução e definido na instrução log4j.appender usando UPPER-CASE!

Um arquivo correto seria

log4j.rootLogger=FILE

log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=c:/Trace/MsgStackLogging.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%m%n
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=false

Se MAVEN for usado, você deverá colocar os arquivos log4j.properties src/main/resourcesE iniciar uma construção MAVEN.

O arquivo Log4j.properties é então copiado na target/classespasta.

O Log4J usa o log4j.propertiesarquivo que encontrou target/classes!


1

Eu tive esse problema também. Esqueci de marcar o diretório de recursos no IntelliJ IDEA

  1. Clique com o botão direito do mouse no seu diretório
  2. Marque o diretório como
  3. Raiz de recursos

1

Se você estiver usando o Eclipse e esse problema aparecer do nada depois que tudo funcionou bem antes, tente ir Project - Clean - Clean.


0

Não foi possível encontrar minha instalação do Eclipse log4j.propertiesao executar testes JUnit a partir do Eclipse, mesmo que o arquivo estivesse localizado em src/test/resources.

O motivo foi que o Eclipse (ou o conector m2e ) não copiou o conteúdo da src/test/resourcespasta de saída esperada target/test-classes- a causa principal foi que nas propriedades do projeto em Java Build Path -> guia Source -> pastas de origem no caminho de construção -> src / teste / recursos , de alguma forma houve uma Excluded: **entrada. Eu removi essa entrada excluída .

Como alternativa, eu poderia ter copiado manualmente src/test/resources/log4j.propertiespara target/test-classes/log4j.properties.


0

Se log4j.propertiesrealmente estiver no caminho de classe, você está usando o Spring Boot para criar um arquivo WAR para implantação em um servidor de aplicativos, está omitindo um web.xmlarquivo a favor da configuração automática do Spring Boot e não está recebendo nenhuma mensagem de log, precisa explicitamente configure o Log4j. Supondo que você esteja usando o Log4j 1.2.x:

public class AppConfig extends SpringBootServletInitializer {

    public static void main( String[] args ) {
        // Launch the application
        ConfigurableApplicationContext context = SpringApplication.run( AppConfig.class, args );
    }

    @Override
    protected SpringApplicationBuilder configure( SpringApplicationBuilder application ) {
        InputStream log4j = this.getClass().getClassLoader().getResourceAsStream("log4j.properties");
        PropertyConfigurator.configure(log4j);
        return application;
    }

// Other beans as required...
}

0

Talvez adicione o projeto relevante que contém log4j no caminho de construção do java, eu adiciono o mahout_h2o quando encontrei esse problema em um projeto do mahout usando o eclipse, ele funciona!


0

se você trabalha em conjunto com muitos projetos, pode enfrentar um problema de estilo.

* você precisa ter um arquivo lof4j.properties e esse arquivo está incluído nas propriedades de log de outro projeto.

* Ao lado de você pode tentar colocar os arquivos de propriedades log4j no caminho src quando o projeto é executado, o Linux OS, as bibliotecas de outros projetos e os arquivos log4.properties podem estar em uma pasta em um local no caminho de classe.


0

Primeira importação:

 import org.apache.log4j.PropertyConfigurator;

Em seguida, adicione o código abaixo ao método principal:

String log4jConfPath ="path to/log4j.properties";
PropertyConfigurator.configure(log4jConfPath);

Crie um arquivo no caminho para e adicione o código abaixo a esse arquivo.

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n

0

A solução neste site funcionou para mim https://crunchify.com/java-how-to-configure-log4j-logger-property-correctly/ . Agora não vejo nenhum aviso do log4j

Coloquei isso em um arquivo log4j.properties que coloquei em src / main / resources

# This sets the global logging level and specifies the appenders
log4j.rootLogger=INFO, theConsoleAppender

# settings for the console appender
log4j.appender.theConsoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.theConsoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.theConsoleAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

0

Primeiro de tudo: Crie um arquivo log4j.properties

# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

Coloque-o em src / main / resources /

Depois disso, use estas 2 dependências:

<dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.5</version>
        </dependency>

É necessário adicionar esta dependência final ao arquivo POM:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>

0

Considere o argumento Dlog4j.configuration da JVM log4j

Em geral:

Inclua o argumento da JVM que aponta o arquivo de configuração log4j. A sintaxe é a seguinte:

java [ options ] -jar file.jar [ arguments ]

Uma amostra de uma linha de comando real é exatamente como a seguir:

java -Dlog4j.configuration=conf/log4j.xml -jar myJarFile.jar myArg1 myArg2

Para usuários do IntelliJ IDE:

1.Run/Debug Configurations
2.Edit configurations...
3.VM options
4.Enter the same value also starting with "-D"

Dicas:

1. Os usuários do IDE Eclipse encontrarão uma abordagem equivalente

2.Para o editor de configuração de execução / depuração, é muito provável que, no início dos tempos, seu arquivo executável específico não esteja lá. Dependendo do tamanho do projeto em que você está trabalhando, pode ser desagradável navegar pelos diretórios para encontrá-lo. É menos trabalhoso se você apenas executar / executar o arquivo (clique em reproduzir) uma vez antes de continuar executando / depurar a configuração, independentemente do resultado da execução.

3. Preste atenção ao seu diretório de trabalho, caminhos relativos e caminho de classe.


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.