记录器(log4j)没有找到appender?

时间:2012-09-21 14:17:21

标签: java eclipse log4j

我已将log4j放入buildpath,但运行应用程序时收到以下消息:

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.

这些警告意味着什么?什么是appender在这里?

31 个答案:

答案 0 :(得分:393)

Short introduction to log4j指南有点陈旧但仍有效。

该指南将为您提供有关如何使用记录器和追加器的一些信息。


为了让你前进,你可以采取两种简单的方法。

首先,只需将此行添加到主方法中:

BasicConfigurator.configure();

第二种方法是将此标准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

答案 1 :(得分:70)

看起来您需要将log4j.properties文件的位置添加到Eclipse中的Classpath。

确保您的项目在Eclipse中打开,然后单击Eclipse顶部的“运行”菜单并单击以下内容:

  1. 运行
  2. 运行配置
  3. Classpath(tab)
  4. 用户条目
  5. 高级(右侧按钮)
  6. 添加文件夹
  7. 然后导航到包含log4j.properties文件的文件夹
  8. 应用
  9. 运行
  10. 不应再显示错误消息。

答案 2 :(得分:37)

快速解决方案:

  1. 将代码添加到主要功能

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

    创建一个名为log4j.properties的文件
    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
    

答案 3 :(得分:31)

这只是一个警告。

修复

当找不到默认配置文件log4j.propertieslog4j.xml且应用程序未执行显式配置时,会发生这种情况。

要解决此问题,只需创建/复制log4j.propertieslog4j.xml类路径上的某个位置(通常与jar文件相同)。

可选择设置java选项:-Dlog4j.configuration=file:///path/to/log4j.properties

  

log4j使用Thread.getContextClassLoader().getResource()查找默认配置文件,但不直接检查文件系统。了解放置log4j.propertieslog4j.xml的适当位置需要了解正在使用的类加载器的搜索策略。 log4j不提供默认配置,因为在某些环境中可能禁止输出到控制台或文件系统。

调试

对于调试,您可以尝试使用-Dlog4j.debug=true参数。

log4j.properties

的配置

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

这是另一个使用多个appender的配置文件:

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

如果使用 Solr ,请将<solr>/example/resources/log4j.properties复制到类路径上的某个位置。

来自Solr的log4j.properties的示例配置如下:

#  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

另见:

答案 4 :(得分:7)

您可以使用代码中的Logger来记录消息。 Appender是附加到Logger的对象,用于将消息写入特定目标。有FileAppender写入文本文件或ConsoleAppender写入控制台。您需要显示Logger和Appender设置的代码以获得更多帮助。

请阅读tutorial以更好地了解Logger和Appender的交互。

答案 5 :(得分:7)

如前所述,有两种方法

首先,只需将此行添加到主方法中:

BasicConfigurator.configure();

第二种方法是将此标准 log4j.properties 文件添加到类路径中:

在采用第二种方法时,您需要确保正确初始化文件, 例如

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");

确保创建所需的文件夹以存储日志文件。

答案 6 :(得分:7)

此处的大多数答案都建议将log4j.properties文件放在正确的位置(对于maven项目,它应位于src/main/resources

但对我来说,问题是我的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

答案 7 :(得分:5)

我得到了同样的错误。这是导致此错误消息的问题:

在配置log4j之前,我创建了一些使用Logger的对象:

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

解决方案: 在main方法的开头配置log4j:

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

答案 8 :(得分:4)

确保属性文件已正确设置。 而且,似乎编译器无法找到属性文件,您可以在pom中设置如下(仅当您使用maven项目时)。

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

答案 9 :(得分:3)

添加以下内容作为第一个代码:

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

答案 10 :(得分:3)

我认为您应该了解log4j jar文件或Java代码查找log4j配置文件的位置。

src/main/resources/log4j.properties是Eclipse路径。 将它们放在适当的位置,这样您就不必在代码中硬编码绝对路径。

阅读我的文章和示例解决方案 http://askyourquestions.info/2016/03/27/how-to-see-where-the-log-is-logger-in-slf4j/

答案 11 :(得分:2)

在我的情况下,错误是标记“ additivity ”。如果你的根项目包是“假的”,那么子包将没有appender,你会看到“ appender not found ”错误。

答案 12 :(得分:2)

可能发生这种情况的另一个原因(在RCP4中)是您在目标文件中使用多个日志记录框架。例如,如果在目标文件内容选项卡中使用slf4j,log4j和ch.qos.logback.slf4j的组合,则会发生这种情况。

答案 13 :(得分:1)

原因可能是某些内容中缺少单词static

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

如果我将logger作为实例字段,我会收到这个警告:

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

更糟糕的是,警告不是指错误所在的ProcessorTest,而是指一个绝对不同的班级(发件人)作为问题的根源。 类具有正确的设置记录器,无需任何更改!我们可以长期寻找问题!

答案 14 :(得分:1)

确保您的项目在Eclipse中打开,然后单击Eclipse顶部的“运行”菜单并单击以下内容:

  1. 运行

  2. 运行配置

  3. Classpath(tab)

  4. 用户条目

  5. 在右边添加jar

  6. 添加log4j jar文件

  7. 应用

  8. 运行

  9. 不应再显示错误消息。

答案 15 :(得分:1)

I faced the same problem when I use log4j2. My problem is caused by using wrong dependent library:

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

Instead, I should use:

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

In my case, I have a log4j2.xml defined in my "resources" directory, and specified to use it by:

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

答案 16 :(得分:1)

我在尝试使用intellij 12中的maven构建可执行jar时遇到了这个问题。事实证明,因为java清单文件没有包含类路径,所以无法找到log4j属性文件在根级别(从中执行jar文件的位置。)

仅供参考我是这样的记录器:

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

我能够使用包含此内容的pom文件:

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

答案 17 :(得分:1)

首先:创建一个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

将其放在src / main / resources /

之后,请使用以下2个依赖项:

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

有必要将此最终依赖项添加到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>

答案 18 :(得分:1)

在搜索Log4j Java代码以在程序中创建第一个日志行时,Log4J显示此警告消息。

这时,Log4j做两件事

  1. 搜索以找到log4j.properties文件
  2. 搜索实例化在log4j.properties中定义的附加器

如果log4J找不到log4j.properties文件,或者log4j.rootlogger文件中的其他地方未定义log4j.properties中声明的追加程序,则会显示警告消息。

注意:属性文件的内容必须正确。

以下内容不正确

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

因为file附加程序在LOWER-CASE的log4j.rootlogger语句中声明,并在log4j.appender语句中使用UPPER-CASE定义!

正确的文件应该是

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

如果使用MAVEN,则必须将log4j.properties文件放入src/main/resources中并开始进行MAVEN构建。

然后将Log4j.properties文件复制到target/classes文件夹中。

Log4J使用在log4j.properties中找到的target/classes文件!

答案 19 :(得分:0)

也许在java构建路径中添加相关项目包含log4j,当我在使用eclipse的mahout项目中遇到此问题时,我将mahout_h2o添加到其中,它可以工作!

答案 20 :(得分:0)

对我来说,原因显然不同,并且错误消息具有误导性。

仅在我的build.gradle中使用它,它会抱怨slf4j在日志的开头丢失了,但是仍然记录了东西,尽管格式很差:

    compile 'log4j:log4j:1.2.17'

即使我已经在src/main/java/log4j.properties中定义了依赖性,添加该依赖性也会导致所讨论的“找不到附加器”错误消息:

    compile 'log4j:log4j:1.2.17'
    compile 'org.slf4j:slf4j-log4j12:1.7.25'

最后,添加以下依赖项(我只是从另一个项目中复制了它,才猜到了)解决了这个问题:

    compile 'log4j:log4j:1.2.17'
    compile 'org.slf4j:slf4j-log4j12:1.7.25'
    compile 'commons-logging:commons-logging:1.2'

我不知道为什么,但是有了它就可以了。有什么见解吗?

答案 21 :(得分:0)

考虑log4j JVM参数 Dlog4j.configuration

通常:

添加指出log4j配置文件的JVM参数。 语法如下:

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

真实命令行示例如下:

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

对于IntelliJ IDE用户:

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

提示:

1.Eclipse IDE用户将找到等效的方法

2。对于运行/调试配置编辑器,很可能一开始,您的特定可执行文件不存在。根据您当前正在处理的项目的大小,导航目录来查找它可能会很不愉快。无论执行结果是什么,只要在执行运行/调试配置之前先运行/执行文件一次(单击播放)(),就没有麻烦了。

3。请注意您的工作目录,相对路径和类路径。

答案 22 :(得分:0)

如果您使用的是Eclipse,但在一切正常之前,这个问题突然出现,请尝试转到Project - Clean - Clean

答案 23 :(得分:0)

当我尝试运行JUnit测试类时,我遇到了同样的问题。

在我手动将log4j.properties文件添加到src / test / resources文件夹后,问题得以解决。

将以下代码添加到log4j.properties文件中可解决此问题:

# 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

答案 24 :(得分:0)

The solution on this site worked for me https://crunchify.com/java-how-to-configure-log4j-logger-property-correctly/. I now see no warnings at all from log4j

I put this in a log4j.properties file that I put in 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

答案 25 :(得分:0)

首先导入:

 import org.apache.log4j.PropertyConfigurator;

然后将以下代码添加到main方法:

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

路径创建文件,并将以下代码添加到该文件中。

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

答案 26 :(得分:0)

如果您与许多项目一起工作,您可能会遇到样式问题。

*您必须拥有一个lof4j.properties文件,并且此文件包含其他项目的日志属性。

*除了你可以尝试将项目工作时将log4j属性文件放入src路径Linux OS,其他项目的libs和log4.properties文件可以在一个文件夹下放到类路径上的一个位置。

答案 27 :(得分:0)

如果log4j.properties确实在类路径上,那么您正在使用Spring Boot制作一个WAR文件以部署到应用服务器,您省略了web.xml文件以支持Spring Boot的自动配置,并且如果没有收到任何日志消息,则需要显式配置Log4j。假设您使用的是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...
}

答案 28 :(得分:0)

从Eclipse运行 JUnit 测试时,我的Eclipse安装找不到log4j.properties,即使该文件位于src/test/resources

原因是Eclipse(或 m2e 连接器)没有将内容从src/test/resources复制到预期的输出文件夹target/test-classes - 根本原因是在项目中& Java Build Path 下的#39;属性 - &gt; 来源标签 - &gt; 构建路径上的源文件夹 - &gt; src / test / resources ,不知何故有一个Excluded: **条目。我删除了排除条目。

或者,我可以手动将src/test/resources/log4j.properties复制到target/test-classes/log4j.properties

答案 29 :(得分:-1)

我也有这个问题。 我只是忘了在IntelliJ IDEA中标记资源目录

  1. 右键单击您的目录
  2. 将目录标记为
  3. 资源根

答案 30 :(得分:-3)

在java eclipse中将conf_ref复制到conf文件夹。