我已将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在这里?
答案 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顶部的“运行”菜单并单击以下内容:
不应再显示错误消息。
答案 2 :(得分:37)
快速解决方案:
将代码添加到主要功能:
String log4jConfPath = "/path/to/log4j.properties";
PropertyConfigurator.configure(log4jConfPath);
在 / 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.properties
和log4j.xml
且应用程序未执行显式配置时,会发生这种情况。
要解决此问题,只需创建/复制log4j.properties
或log4j.xml
到类路径上的某个位置(通常与jar文件相同)。
可选择设置java选项:-Dlog4j.configuration=file:///path/to/log4j.properties
。
log4j
使用Thread.getContextClassLoader().getResource()
查找默认配置文件,但不直接检查文件系统。了解放置log4j.properties
或log4j.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
如果使用 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顶部的“运行”菜单并单击以下内容:
运行
运行配置
Classpath(tab)
用户条目
在右边添加jar
添加log4j jar文件
应用
运行
不应再显示错误消息。
答案 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做两件事
log4j.properties
文件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中标记资源目录
答案 30 :(得分:-3)
在java eclipse中将conf_ref复制到conf文件夹。