找不到用于logger(log4j)的附加程序?


368

我已经将log4j放到了我的构建路径中,但是在运行应用程序时收到以下消息:

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.

这些警告是什么意思?这里的追加器是什么?


5
这似乎是运行时警告。您确定在编译时会看到此消息吗?
maba 2012年

5
您是否尝试访问警告最后一行中的URL?
Jesper 2012年

4
是!!!但这没多说...我发现我需要一个属性文件来配置我的appender!
maximus 2012年

手动编辑配置文件以添加附加器。确保您拥有正确且有效的配置文件。
罗马C

Answers:


464

这个log4j指南的简短介绍有些陈旧,但仍然有效。

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


为了让您步入正轨,您可以采用两种简单的方法。

首先是将这一行添加到您的main方法中:

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

3
第一步就可以了。引用log4j指南的简短介绍
ray6080 2014年

65
对于新的偶然发现...将log4j.properties文件添加到src / main / resources,这假设您有一个maven项目。src / main / resources中的内容包含在类路径中。
keni

3
在IntelliJ idea打开模块设置中,选择您的资源文件夹,然后单击资源,它将自动将您的每个资源添加到类路径中。
Waqas

1
没帮助 我将Eclipse Neon用于C ++,并且已将log4j.properties与eclipse可执行文件放在一起,并没有帮助
Nadav B

log4j.rootLogger=DEBUG, A1是我一直都想念的那条线。
Mohammad Faisal

74

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

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

  1. 运行配置
  2. 类路径(标签)
  3. 用户条目
  4. 高级(右侧按钮)
  5. 新增资料夹
  6. 然后导航到包含log4j.properties文件的文件夹
  7. 应用

错误消息应该不再出现。


警告消息现在没有出现,但仍未将日志写入所需的位置
Arpan Saini

48

快速解决方案:

  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

将log4j.properties文件放在资源目录内,例如src / test / resource
Alok,

为了避免显式声明log4j.properties路径;将其放置在项目文件夹中,然后像字符串log4jConfPath = System.getProperty(“ user.dir”)+ File.separator +“ log4j.properties”一样进行访问;
Amimo Benja

36

这只是一个警告。

定影

当默认配置文件log4j.propertieslog4j.xml找不到应用程序不执行任何显式配置。

要解决此问题,只需在类路径中创建/复制log4j.properties或复制log4j.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

这是另一个使用多个追加程序的配置文件:

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类路径上的某个位置

log4j.propertiesSolr的示例配置如下:

#  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

也可以看看:


13

这里的大多数答案都建议将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

1
log4j认为“找不到文件”和“文件中的不完整规范”是相同的错误,这是浪费时间。
Ed Norris

1
对我来说,这是最好的答案。我投了赞成票,并在您的回答中添加了一些解释。
schlebe

对我来说最好的答案!
nasqueweaponer

8

如前所述,有2种方法

首先是将这一行添加到您的main方法中:

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

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


我遇到了同样的问题,我使用了BasicConfigurator.configure();。在main方法中,现在代码可以正确执行。
Surabhi Pandey

7

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

请阅读该教程,以更好地了解Logger和Appender的交互。


6

确保正确设置属性文件。再说一次,似乎编译器找不到属性文件,可以在pom上设置如下(仅当使用maven项目时)。

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

这个!我花了几个小时找到答案。我的案例代码在Linux上运行良好,但在Windows(相同的NB IDE)中有此错误,并且以上所有解决方案均不起作用!
Tiana987642 '17

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

非常感谢!!!每个人都只是假设使用Spring或Tomcat,或进行任何初始化配置的操作。
Windgazer


3

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


3

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

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

2

在我的情况下,错误是标记“ additivity ”。如果您的根项目包为“ false”,则子包将没有附加程序,并且您将看到“ 找不到附加程序 ”错误。


2

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

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

将以下代码添加到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

1

当尝试在intellij 12中使用maven构建可执行jar时,我遇到了这个问题。事实证明,由于java清单文件不包含类路径,因此无法在根级别(其中执行了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>

1

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

  1. 运行配置

  2. 类路径(标签)

  3. 用户条目

  4. 在右边添加罐子

  5. 添加log4j jar文件

  6. 应用

错误消息应该不再出现。


1

原因可能是缺少static某些单词:

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

如果我将logger设置为instance字段,则会得到以下警告:

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

更糟糕的是,警告并非指向ProcessorTest错误的根源,而是指向一个完全不同的类别(发件人)作为问题根源。这个类有正确的一组记录仪,不用任何变化!我们可能会一直寻找这个问题!


1

使用log4j2时,我遇到了同样的问题。我的问题是由使用错误的依赖库引起的:

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

相反,我应该使用:

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

在我的情况下,我在“ resources”目录中定义了一个log4j2.xml,并指定通过以下方式使用它:

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

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

因为fileappender在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/resourcesAND中并开始进行MAVEN构建。

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

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


1

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

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

1

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


0

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

原因是Eclipse(或m2e连接器)未将内容从其复制src/test/resources到预期的输出文件夹target/test-classes-根本原因是在Java Build Path- > Source选项卡-> build path上的Source folder- > src /下的项目属性中测试/资源,不知何故有一个Excluded: **条目。我删除了该排除的条目。

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


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

0

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


0

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

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

*在项目运行Linux操作系统时,除了可以尝试将log4j属性文件放入src路径外,其他项目的库和log4.properties文件也可以放在一个文件夹下,位于类路径上的某个位置。


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

0

这个网站上的解决方案对我有用https://crunchify.com/java-how-to-configure-log4j-logger-property-correctly/。我现在看不到log4j发出任何警告

我把它放在我放在src / main / resources中的log4j.properties文件中

# 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

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

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.注意您的工作目录,相对路径和类路径。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.