436

我已将 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.

这些警告是什么意思?这里的附加程序是什么?

4

32 回答 32

530

这个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
于 2012-09-21T14:23:16.897 回答
82

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

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

  1. 运行配置
  2. 类路径(选项卡)
  3. 用户条目
  4. 高级(右侧按钮)
  5. 添加文件夹
  6. 然后导航到包含您的 log4j.properties 文件的文件夹
  7. 申请

错误消息不应再出现。

于 2014-02-02T07:52:42.463 回答
57

快速解决方案:

  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
    
于 2014-04-22T08:13:48.997 回答
41

这只是一个警告。

定影

当无法找到默认配置文件log4j.properties并且应用程序未执行显式配置时会发生这种情况。log4j.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

阿帕奇索尔

如果使用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

也可以看看:

于 2015-04-06T20:20:03.040 回答
22

这里的大多数答案都建议将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
于 2016-08-09T02:13:33.067 回答
9

如前所述,有两种方法

第一个是将这一行添加到您的主要方法中:

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

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

于 2014-12-22T13:47:34.160 回答
7

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

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

于 2012-09-21T14:21:48.843 回答
7

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

<build>
       <sourceDirectory> src/main/java</sourceDirectory>
       <testSourceDirectory> src/test/java</testSourceDirectory>
        <resources>
             <resource>
                  <directory>resources</directory>
             </resource>
        </resources>           
</build >
于 2016-11-11T01:50:39.693 回答
6

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

在配置 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
于 2013-09-24T12:39:32.860 回答
6

当我尝试运行 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
于 2019-07-04T11:06:00.497 回答
5

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

Properties prop = new Properties();
prop.setProperty("log4j.rootLogger", "WARN");
PropertyConfigurator.configure(prop);
于 2017-05-22T10:23:54.350 回答
4

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

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

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

于 2016-04-28T14:36:34.897 回答
3

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

于 2017-03-15T17:17:10.710 回答
2

在我的例子中,错误是标志“ additivity ”。如果根项目包为“假”,则子包将没有附加程序,您将看到“未找到附加程序”错误。

于 2016-11-11T11:05:07.047 回答
2

如果您使用的是 Eclipse,并且在一切正常之后突然出现此问题,请尝试转到Project - Clean - Clean.

于 2019-11-04T09:37:42.727 回答
2

首先:创建一个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>
于 2020-02-21T21:35:23.573 回答
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>
于 2014-07-24T06:49:14.723 回答
1

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

  1. 运行配置

  2. 类路径(选项卡)

  3. 用户条目

  4. 在右侧添加罐子

  5. 添加 log4j jar 文件

  6. 申请

错误消息不应再出现。

于 2016-01-11T19:03:55.607 回答
1

原因可能是在某些情况下缺少这个词static

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

如果我让 logger 成为实例字段,我会得到这个非常警告:

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

更糟糕的是,警告不是指向ProcessorTest错误所在的位置,而是指向一个完全不同的类(发件人)作为问题的根源。该类具有正确的设置记录器,不需要任何更改!我们可以找很久的问题!

于 2016-08-02T09:34:02.387 回答
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>

就我而言,我在“资源”目录中定义了一个 log4j2.xml,并指定通过以下方式使用它:

System.setProperty("log4j.configurationFile", "log4j2.xml");
于 2016-08-31T12:31:01.383 回答
1

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

此时,Log4j 做了 2 件事

  1. 它搜索查找log4j.properties文件
  2. 它搜索以实例化 appender 定义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-CASElog4j.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

于 2018-10-19T09:20:33.733 回答
1

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

  1. 右键单击您的目录
  2. 将目录标记为
  3. 资源根
于 2018-11-23T10:15:33.910 回答
1

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

在我的 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'

我不知道为什么,但这样它就可以了。对此有何见解?

于 2020-06-17T06:52:55.310 回答
0

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

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

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

于 2016-08-16T17:37:54.417 回答
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...
}
于 2017-08-10T11:03:08.123 回答
0

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

于 2018-05-03T15:43:10.697 回答
0

如果您与很多项目一起工作,您可能会面临风格问题。

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

*另外你可以尝试在项目运行Linux OS时将log4j属性文件放入src路径,其他项目的libs和log4.properties文件可以在一个文件夹下放入类路径中的某个位置。

于 2018-05-04T13:51:49.740 回答
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
于 2018-06-08T11:59:14.850 回答
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
于 2018-09-18T20:35:46.657 回答
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.注意你的工作目录、相对路径和类路径。

于 2020-03-17T16:00:07.523 回答
0

尝试运行单元测试时,我在 IntelliJ 中收到此错误消息。我同时打开了 Eclipse 和 IntelliJ,这可能导致了这个问题。在我关闭了两个 IDE 并运行了一个 Maven 命令行构建后,错误就消失了。

于 2021-09-08T20:20:11.483 回答
-4

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

于 2016-07-20T10:53:33.693 回答