在添加log4j到我的应用程序后,每次执行我的应用程序时,我都会得到以下输出:

log4j:WARN No appenders could be found for logger (slideselector.facedata.FaceDataParser).
log4j:WARN Please initialize the log4j system properly.

这似乎意味着一个配置文件丢失了。 这个配置文件应该放在哪里,一个好的开始内容是什么?

我正在使用纯java开发桌面应用程序。所以没有网络服务器等等…


当前回答

可以使用setLevel()设置日志级别。

这些级别对于轻松设置希望程序显示的信息类型非常有用。

例如:

Logger.getRootLogger().setLevel(Level.WARN); //will not show debug messages

可能的级别集是:

跟踪, 调试、 信息, 警告说, 错误和 致命的

根据日志服务手册

其他回答

我已经创建了文件log4j。hibernate.cfg.xml文件旁边的资源文件夹中的属性,并用下面的文本填充:

log4j.rootLogger=INFO, CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n

现在我去掉了警告和错误

根据Apache Log4j FAQ页面:

Why do I see a warning about "No appenders found for logger" and "Please configure log4j properly"? This occurs when the default configuration files log4j.properties and log4j.xml can not be found and the application performs no explicit configuration. log4j uses Thread.getContextClassLoader().getResource() to locate the default configuration files and does not directly check the file system. Knowing the appropriate location to place log4j.properties or log4j.xml requires understanding the search strategy of the class loader in use. log4j does not provide a default configuration since output to the console or to the file system may be prohibited in some environments.

基本上,警告No appenders could be found for logger意味着您正在使用log4j日志记录系统,但是您还没有在配置文件中添加任何appenders(例如FileAppender, ConsoleAppender, SocketAppender, SyslogAppender等),或者配置文件丢失。

配置log4j有三种方法:使用属性文件(log4j.properties)、使用XML文件和通过Java代码(rootLogger. properties)。新NullAppender addAppender(());。

log4j . properties

如果你有属性文件(例如安装Solr时),你需要把这个文件放在你的类路径目录中。

类路径

下面是Linux中如何确定类路径值的一些命令建议:

$ echo $CLASSPATH
$ ps wuax | grep -i classpath
$ grep -Ri classpath /etc/tomcat? /var/lib/tomcat?/conf /usr/share/tomcat?

或者从Java: System.getProperty(" Java .class.path")。

Log4j XML

下面是log4j的XML格式的基本XML配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Target" value="System.out"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/> 
    </layout> 
  </appender> 

  <root> 
    <priority value ="debug" /> 
    <appender-ref ref="console" /> 
  </root>
  
</log4j:configuration>

Tomcat

如果您正在使用Tomcat,您可以放置您的log4j。属性到/usr/share/tomcat?/lib/ /var/lib/tomcat?/ webapps / * / web - inf / lib文件夹中。

Solr

作为参考,Solr default log4j。属性文件如下所示:

#  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不能在J2EE或WAR应用程序中找到我的属性文件?

简单的回答是:log4j类和属性文件不在同一个类加载器的范围内。 Log4j只使用默认的Class.forName()机制来加载类。资源的处理类似。有关更多细节,请参阅java.lang.ClassLoader的文档。 因此,如果遇到问题,请尝试自己加载类或资源。如果您找不到它,那么log4j也找不到。;)


参见:

Apache站点上log4j的简短介绍 Apache:日志服务:Apache站点的常见问题

虽然正确地设置log4j对于“真正的”项目很好,但你可能想要一个快速而肮脏的解决方案,例如,如果你只是在测试一个新库。

如果是,则调用静态方法

org.apache.log4j.BasicConfigurator.configure();

将在控制台设置基本日志记录,错误消息将消失。

默认情况下,Log4j查找一个名为Log4j的文件。属性或类路径上的log4j.xml。

您可以通过设置这里描述的系统属性来控制它使用哪个文件来初始化自己(请参阅“默认初始化过程”部分)。

例如:

java -Dlog4j.configuration=customName ....

将导致log4j在类路径上查找名为customName的文件。

如果你有问题,我发现打开log4j.debug很有帮助:

-Dlog4j.debug

它将打印到系统。给出了很多有用的信息,比如它使用哪个文件来初始化自己,哪个记录器/追加器被配置了,以及如何配置等等。

配置文件可以是java属性文件,也可以是xml文件。下面是来自log4j介绍文档页面的属性文件格式示例:

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

可以使用setLevel()设置日志级别。

这些级别对于轻松设置希望程序显示的信息类型非常有用。

例如:

Logger.getRootLogger().setLevel(Level.WARN); //will not show debug messages

可能的级别集是:

跟踪, 调试、 信息, 警告说, 错误和 致命的

根据日志服务手册