如何正确初始化log4j?

Jan*_*usz 273 configuration log4j

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

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

这似乎意味着缺少配置文件.这个配置文件应该放在哪里,什么是好的开始内容?

我正在使用普通的java来开发桌面应用程序.所以没有网络服务器等......

pol*_*ear 269

默认情况下,Log4j在类路径中查找名为log4j.properties或log4j.xml的文件.您可以通过设置此处所述的系统属性来控制它用于初始化自身的文件(查找"默认初始化过程"部分).

例如:

java -Dlog4j.configuration=customName ....
Run Code Online (Sandbox Code Playgroud)

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

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

-Dlog4j.debug
Run Code Online (Sandbox Code Playgroud)

它将向System.out打印许多有用的信息,这些信息用于初始化自己的文件,配置了哪些记录器/追加器以及如何配置等等.

配置文件可以是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
Run Code Online (Sandbox Code Playgroud)

  • 因此,要从不在类路径上的文件加载configuartion文件,您必须执行以下操作:-Dlog4j.configuration = file:/ c:/my/folder/log4j.properties实际上是一个URL. (43认同)
  • 可能有人会觉得有用的一个小提示:你也可以通过在代码中启用相应的属性来打开_log4j_调试器 - **System.setProperty("log4j.debug","");** (15认同)
  • 尝试了很多变化后,这个工作正常:-Dlog4j.configuration = file:/// C:/mydir/subdir/log4j.properties上面的示例:-Dlog4j.configuration = file:/ c:/my/folder/log4j.properties失败. (2认同)
  • 我真的希望手册更强调`-Dlog4j.debug` 可以帮助调试您的配置。 (2认同)

小智 235

虽然正确设置log4j非常适合"真实"项目,但您可能需要快速而肮脏的解决方案,例如,如果您只是测试新库.

如果是这样的话,调用静态方法

org.apache.log4j.BasicConfigurator.configure();
Run Code Online (Sandbox Code Playgroud)

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

  • 请记住,这将默认为调试级日志记录,这可能是不可取的.您可以像这样更改:`Logger.getRootLogger().setLevel(Level.INFO);` (5认同)
  • 具有讽刺意味的..我们在生产状态上使用它 (2认同)

use*_*217 25

如果你只是摆脱一切(例如,如果你在测试中)

org.apache.log4j.BasicConfigurator.configure(new NullAppender());
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 20

根据Apache Log4j FAQ页面:

为什么我会看到"没有找到记录器的appender"和"请正确配置log4j"的警告?

出现这种情况的默认配置时,文件log4j.propertieslog4j.xml不能被发现和应用程序执行没有明确的配置.log4j用于Thread.getContextClassLoader().getResource()查找默认配置文件,而不是直接检查文件系统.了解放置log4j.properties的适当位置或log4j.xml需要了解正在使用的类加载器的搜索策略.log4j不提供默认配置,因为在某些环境中可能禁止输出到控制台或文件系统.

基本上警告没有为记录器找到appender意味着你正在使用log4j日志系统,但你没有在配置文件中添加任何Appender(如FileAppender,ConsoleAppender,SocketAppender,SyslogAppender等)或配置文件是失踪.

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

log4j.properties

如果您存在属性文件(例如,在安装Solr时),则需要将此文件放在classpath目录中.

类路径

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

$ echo $CLASSPATH
$ ps wuax | grep -i classpath
$ grep -Ri classpath /etc/tomcat? /var/lib/tomcat?/conf /usr/share/tomcat?
Run Code Online (Sandbox Code Playgroud)

或者来自Java : System.getProperty("java.class.path").

Log4j XML

以下是XML格式的log4j的基本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>
Run Code Online (Sandbox Code Playgroud)

Tomcat的

如果您使用的是Tomcat,则可以将您log4j.properties放入:/usr/share/tomcat?/lib//var/lib/tomcat?/webapps/*/WEB-INF/lib/文件夹.

Solr的

作为参考,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
Run Code Online (Sandbox Code Playgroud)

为什么log4j不能在J2EE或WAR应用程序中找到我的属性文件?

简短的回答:log4j类和属性文件不在同一个类加载器的范围内.

Log4j仅使用默认Class.forName()机制来加载类.资源的处理方式类似.有关java.lang.ClassLoader更多详细信息,请参阅文档.

因此,如果您遇到问题,请尝试自己加载课程或资源.如果你找不到它,log4j也不会.;)


也可以看看:


Ara*_*ash 12

您可以使用以下命令从java应用程序内部设置log4j.properties的位置:

org.apache.log4j.PropertyConfigurator.configure(file/location/log4j.properties)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请访问:https://logging.apache.org/log4j/1.2/manual.html


Jee*_*Bee 10

在线查找具有root appender的log4j.properties或log4j.xml,并将其放在类路径中.

### 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.SimpleLayout
log4j.rootLogger=debug, stdout
Run Code Online (Sandbox Code Playgroud)

将登录到控制台.我更喜欢记录到文件,以便您可以进行调查.

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.maxFileSize=100KB
log4j.appender.file.maxBackupIndex=5
log4j.appender.file.File=test.log
log4j.appender.file.threshold=debug
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug,file
Run Code Online (Sandbox Code Playgroud)

虽然对于详细的日志记录应用程序,100KB通常需要增加到1MB或10MB,尤其是对于调试.

我个人设置了多个记录器,并将根记录器设置为警告或错误级别而不是调试.


sto*_*333 9

在不将属性文件放在类路径上的另一种方法是直接从java代码设置属性.这是示例代码.

public class Log4JSample {

public static void main(String[] args) {
    Properties properties=new Properties();
    properties.setProperty("log4j.rootLogger","TRACE,stdout,MyFile");
    properties.setProperty("log4j.rootCategory","TRACE");

    properties.setProperty("log4j.appender.stdout",     "org.apache.log4j.ConsoleAppender");
    properties.setProperty("log4j.appender.stdout.layout",  "org.apache.log4j.PatternLayout");
    properties.setProperty("log4j.appender.stdout.layout.ConversionPattern","%d{yyyy/MM/dd HH:mm:ss.SSS} [%5p] %t (%F) - %m%n");

    properties.setProperty("log4j.appender.MyFile", "org.apache.log4j.RollingFileAppender");
    properties.setProperty("log4j.appender.MyFile.File", "my_example.log");
    properties.setProperty("log4j.appender.MyFile.MaxFileSize", "100KB");
    properties.setProperty("log4j.appender.MyFile.MaxBackupIndex", "1");
    properties.setProperty("log4j.appender.MyFile.layout",  "org.apache.log4j.PatternLayout");
    properties.setProperty("log4j.appender.MyFile.layout.ConversionPattern","%d{yyyy/MM/dd HH:mm:ss.SSS} [%5p] %t (%F) - %m%n");

    PropertyConfigurator.configure(properties);

    Logger logger = Logger.getLogger("MyFile");

    logger.fatal("This is a FATAL message.");
    logger.error("This is an ERROR message.");
    logger.warn("This is a WARN message.");
    logger.info("This is an INFO message.");
    logger.debug("This is a DEBUG message.");
    logger.trace("This is a TRACE message.");
}
Run Code Online (Sandbox Code Playgroud)

}


Mat*_*ath 6

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

这些级别可以轻松设置您希望程序显示的信息类型.

例如:

Logger.getRootLogger().setLevel(Level.WARN); //will not show debug messages
Run Code Online (Sandbox Code Playgroud)

可能的级别集合是:

跟踪,

DEBUG,

信息,

警告,

错误和

致命

根据Logging Services手册


小智 6

import org.apache.log4j.BasicConfigurator;
Run Code Online (Sandbox Code Playgroud)

调用此方法

BasicConfigurator.configure();
Run Code Online (Sandbox Code Playgroud)