logging器(log4j)没有findappender?
我已经把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?
这个简短的介绍log4j指南是有点老,但仍然有效。
该指南将给你一些关于如何使用logging器和appender的信息。
为了让你走,你有两个简单的方法,你可以采取。
首先是将这一行添加到您的主要方法:
BasicConfigurator.configure();
第二种方法是将这个标准的log4j.properties
(取自上面提到的指南)文件添加到你的类path中:
# 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.properties
文件的位置添加到Eclipse中的Classpath中。
确保您的项目在Eclipse中打开,然后单击Eclipse顶部的“运行”菜单,然后单击以下选项:
- 跑
- 运行configuration
- 类path(选项卡)
- 用户条目
- 高级(button在右边)
- 添加文件夹
- 然后导航到包含您的log4j.properties文件的文件夹
- 应用
- 跑
错误消息不应该再出现。
快速解决:
-
添加代码到主要function :
String log4jConfPath = "/path/to/log4j.properties"; PropertyConfigurator.configure(log4jConfPath);
-
在/ path / to中创build一个名为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
这只是一个警告。
定影
如果找不到默认configuration文件log4j.properties
和log4j.xml
,并且应用程序不执行显式configuration,则会发生这种情况。
要解决这个问题,只需将log4j.properties
或log4j.xml
创build/复制到类path中的某个位置(通常与jar文件相同)即可。
可以select设置java选项: -Dlog4j.configuration=file:///path/to/log4j.properties
。
log4j
使用Thread.getContextClassLoader().getResource()
来定位默认configuration文件,并不直接检查文件系统。 了解要放置log4j.properties
或log4j.xml
的适当位置,需要了解正在使用的类加载器的search策略。log4j
不提供默认configuration,因为在某些环境中可能禁止输出到控制台或文件系统。
debugging
对于debugging,您可以尝试使用-Dlog4j.debug=true
参数。
configurationlog4j.properties
log4j.properties
示例configuration:
# 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的configuration文件:
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
复制到类path中的某个位置。
来自Solr的log4j.properties
示例configuration如下所示:
# 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
也可以看看:
- 对log4j的简短介绍:默认初始化过程
- 为什么log4j不能在J2EE或WAR应用程序中find我的属性?
您在代码中使用Logger
来logging消息。 Appender
是一个附加到Logger
的对象,将消息写入特定的目标。 有FileAppender
写入文本文件或ConsoleAppender
写入控制台。 您需要显示Logger和Appender设置的代码以获取更多帮助。
请阅读教程 ,以更好地了解logging器和Appender的交互。
如前所述,有两种方法
首先是将这一行添加到您的主要方法:
BasicConfigurator.configure();
第二种方法是将这个标准的log4j.properties文件添加到你的类path中:
采取第二种方法时,你需要确保你正确地初始化文件,例如。
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");
确保您创build了存储日志文件所需的文件夹。
我得到同样的错误。 这里导致这个错误信息的问题:
在configurationlog4j之前,我创build了一些使用Logger的对象:
Logger.getLogger(Lang.class.getName()).debug("Loading language: " + filename);
解决scheme:在主要方法的开头configurationlog4j:
PropertyConfigurator.configure(xmlLog4JConfigFile); // or BasicConfigurator.configure(); if you dont have a config file
我想你应该知道log4j jar文件或Java代码在哪里查找log4jconfiguration文件。
src/main/resources/log4j.properties
是Eclipsepath。 把它们放在适当的位置,这样你就不必在代码中硬编码绝对path。
阅读我的文章和示例解决scheme, http://askyourquestions.info/2016/03/27/how-to-see-where-the-log-is-logger-in-slf4j/
这里的大部分答案都build议log4j.properties
文件应该放在正确的位置(对于maven项目,它应该位于src/main/resources
)
但对我来说,问题是我的log4j.properties
configuration不正确。 这里有一个适合我的示例,你可以先试试。
# 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
确保属性文件已经正确设置。 再次,似乎编译器找不到属性文件,你可以在pom中设置如下(仅在使用maven项目时)。
<build> <sourceDirectory> src/main/java</sourceDirectory> <testSourceDirectory> src/test/java</testSourceDirectory> <resources> <resource> <directory>resources</directory> </resource> </resources> </build >
在我的情况下,错误是标志“可加性 ”。 如果你的根项目包是“false”,那么子包将没有appender,你会看到“ appender not found ”错误。
这可能发生的另一个原因(在RCP4中)是您在目标文件中使用了多个日志logging框架。 例如,如果在目标文件内容选项卡中使用slf4j,log4j和ch.qos.logback.slf4j的组合,就会发生这种情况。
我试图在intellij 12中用maven构build一个可执行的jar时遇到了这个问题。事实certificate,因为java清单文件没有包含类path,所以无法在根级别findlog4j属性文件jar文件被执行。)
仅供参考我正在得到这样的logging器:
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>
确保您的项目在Eclipse中打开,然后单击Eclipse顶部的“运行”菜单,然后单击以下选项:
-
跑
-
运行configuration
-
类path(选项卡)
-
用户条目
-
在右边添加jar
-
添加log4j jar文件
-
应用
-
跑
错误消息不应该再出现。
原因可能是一些static
词缺乏:
final static Logger logging = Logger.getLogger(ProcessorTest.class);
如果我把logging器作为实例字段,我正在得到这个非常警告:
No appenders could be found for logger (org.apache.kafka.producer.Sender)
更糟糕的是,这个警告并没有指出错误所在的ProcessorTest
,而是一个完全不同的类(Sender)作为问题的根源。 那个类有正确的设置logging器,不需要任何改变! 我们可以寻找这个问题的年龄!
当我使用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");
Properties prop = new Properties(); prop.setProperty("log4j.rootLogger", "WARN"); PropertyConfigurator.configure(prop);
即使文件位于src/test/resources
,我的Eclipse安装在从Eclipse运行JUnittesting时也找不到log4j.properties
。
原因是Eclipse(或m2e连接器)没有将src/test/resources
中的内容复制到预期的输出文件夹target/test-classes
– 根本原因是在Java Build Path – > Source选项卡下的项目属性中, > 构buildpath上的源文件夹 – > src / test / resources ,不知何故,有一个Excluded: **
条目。 我删除了排除的条目。
或者,我可以手动将src/test/resources/log4j.properties
复制到target/test-classes/log4j.properties
。
如果log4j.properties
确实在类path中,那么您使用的是Spring Boot来创buildWAR文件以部署到应用程序服务器,您省略了一个web.xml
文件来支持Spring Boot的自动configuration,并且您没有收到任何日志消息无论如何,你需要明确地configurationLog4j。 假设你正在使用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... }
在java eclipse中将您的conf_ref复制到conf文件夹。