没有为日志记录器(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.

这些警告是什么意思?这里的阑尾是什么?

875525 次浏览

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

为了更好地理解Logger和Appender的交互,请阅读教程

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

得到同样的错误。下面是导致错误信息的问题:

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

Logger.getLogger(Lang.class.getName()).debug("Loading language: " + filename);
< p >解决方案: 在main方法的开头配置log4j:

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

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

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

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

错误消息将不再出现。

快速的解决方案:

  1. 添加代码主要功能:

    String log4jConfPath = "/path/to/log4j.properties";
    PropertyConfigurator.configure(log4jConfPath);
    
  2. create a file named log4j.properties at /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
    

我在尝试用intellij 12中的maven构建可执行jar时遇到了这个问题。结果是,因为java清单文件不包括类路径,所以无法在根级别(jar文件从那里执行)找到log4j属性文件。

供参考,我是这样得到记录器的:

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>

如前所述,有两种方法

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

BasicConfigurator.configure();

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

当采用第二种方法时,你需要确保你正确地初始化了文件, 如:< / p >
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");

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

这只是一个警告。

修复

如果找不到默认配置文件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

下面是另一个使用多个追加器的配置文件:

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

参见:

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

  1. 运行

  2. 运行配置

  3. 类路径(选项卡)

  4. 用户条目

  5. 添加右边的罐子

  6. 添加log4j jar文件

  7. 应用

  8. 运行

错误消息将不再出现。

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

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

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

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

原因可能是缺少static这个词:

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

如果我让记录器的实例字段,我得到的正是这个非常警告:

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

更糟糕的是,警告不是指向ProcessorTest,错误就在那里,而是指向一个完全不同的类(Sender)作为问题的来源。类有正确的设置记录器,不需要任何更改!我们可以花很长时间来寻找这个问题!

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

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

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

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

我在使用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");

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

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

在我的例子中,错误是标志“可加性”。如果你的根项目包为“false”,那么子包将没有追加器,你将看到“阑尾未找到”错误。

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

添加如下代码作为第一个代码:

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

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

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

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

*你必须有一个lof4j。属性文件,此文件包括其他项目的日志属性。

*此外,您可以尝试将log4j属性文件放入src路径,当项目工作在Linux操作系统,其他项目的库和log4。属性文件可以放在一个文件夹下的类路径上的某个位置。

首先导入:

 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

这个网站上的解决方案为我工作https://crunchify.com/java-how-to-configure-log4j-logger-property-correctly/。现在我在log4j中没有看到任何警告

我把它放在log4j中。我把它放在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

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

此时Log4j做了两件事

  1. 它搜索找到log4j.properties文件
  2. 它搜索实例化log4j.properties中定义的appender

如果log4J没有找到log4j.properties文件,或者在log4j.rootlogger中声明的appender没有在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 appender在log4j.rootlogger语句中以小写形式声明,并在log4j中定义。使用大写!

正确的文件应该是

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。src/main/resources中的属性文件并开始MAVEN构建。

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

Log4J使用log4j.properties文件,它在target/classes !

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

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

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

在手动添加log4j后,问题得到了解决。src/test/resources文件夹中的Properties文件。

将下面的代码添加到log4j。属性文件解决了这个问题:

# 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

如果你正在使用Eclipse,而这个问题在之前一切正常工作后突然出现,尝试去Project - Clean - Clean

首先:创建一个log4j。属性文件

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

考虑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.对于运行/调试配置编辑器,很可能在开始时,您的特定可执行文件不存在。根据您当前正在处理的项目的大小,在目录中找到它可能会令人不快。不管执行结果是什么,如果你只是在继续运行/调试配置之前,运行/执行一次文件(单击play),那么麻烦就少了。

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

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

我的身材里只有这个。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'

我不知道为什么,但用这个就行了。对此有什么见解吗?

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