当前位置:  开发笔记 > 编程语言 > 正文

如何正确初始化log4j?

如何解决《如何正确初始化log4j?》经验,为你挑选了9个好方法。

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

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

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

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



1> polarbear..:

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

例如:

java -Dlog4j.configuration=customName ....

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

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

-Dlog4j.debug

它将向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


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

2> 小智..:

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

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

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

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


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

3> user831217..:

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

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



4> kenorb..:

根据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?

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

Log4j XML

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





   
     
     
       
     
   

   
     
     
  


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

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

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

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

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


也可以看看:

Apache站点上log4j的简短介绍

Apache:日志服务: Apache站点的常见问题解答



5> Arash..:

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

org.apache.log4j.PropertyConfigurator.configure(file/location/log4j.properties)

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



6> JeeBee..:

在线查找具有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

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

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

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

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



7> 小智..:

在不将属性文件放在类路径上的另一种方法是直接从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.");
}

}



8> Math..:

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

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

例如:

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

可能的级别集合是:

跟踪,

DEBUG,

信息,

警告,

错误和

致命

根据Logging Services手册



9> 小智..:
import org.apache.log4j.BasicConfigurator;

调用此方法

BasicConfigurator.configure();

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有