如何正确初始化log4j?

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

 log4j:WARN记录器(slideselector.facedata.FaceDataParser)找不到appender。
 log4j:WARN请正确初始化log4j系统。

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

我使用普通的Java开发桌面应用程序。 所以没有网络服务器等…

默认情况下,Log4j会在类路径中查找名为log4j.properties或log4j.xml的文件。 您可以通过按照此处所述设置系统属性来控制使用哪个文件来初始化自己(查找“默认初始化过程”部分)。

例如:

java -Dlog4j.configuration=customName .... 

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

如果你有问题,我觉得打开log4j.debug是有帮助的:

 -Dlog4j.debug 

它会打印到System.out很多关于哪个文件用来初始化自己,哪些记录器/ appender被配置以及如何等等的有用信息。

配置文件可以是一个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 

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

如果是这样一个静态方法的调用

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

会设置基本的日志记录到控制台,错误信息将会消失。

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

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

根据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:带有一个XML文件的属性文件( log4j.properties )和Java代码( rootLogger.addAppender(new NullAppender()); )。

log4j.properties

如果你有属性文件存在(例如,当安装Solr),你需要把这个文件放在你的classpath目录下。

类路径

以下是Linux中的一些命令建议如何确定您的classpath值:

 $ 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配置文件:

 <?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.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站点的常见问题

在线查找具有根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,特别是对于调试。

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

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

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

更多信息可以在这里找到: https : //logging.apache.org/log4j/1.2/manual.html

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

}

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

级别对于轻松设置您希望程序显示的信息种类很有用。

例如:

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

可能的级别集合是:

跟踪,

DEBUG,

信息,

警告,

错误和

致命

据测井服务手册

要启用-Dlog4j.debug ,我进入系统,高级系统设置,环境变量 ,并将系统变量_JAVA_OPTIONS设置为-Dlog4j.debug

你在开发什么? 你在使用Apache Tomcat吗?

 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyyMMdd HH:mm:ss.SSS} [[%5p] %c{1} [%t]] %m%n 

我在我的Java应用程序中有这样的属性。

我在hibernate.cfg.xml文件旁边的资源文件夹中创建了文件log4j.properties ,并用下面的文本填充它:

 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 

现在我摆脱了警告和错误

只需在src / main / assembly文件夹下创建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 

如前所述,有两种方法

首先是将这一行添加到您的主要方法:

 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"); 

确保您创建了存储日志文件所需的文件夹。

尝试在log4j:configuration节点中将debug attribut设置为true。

 <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true"> 

当读取配置文件并用于配置log4j环境时,它将输出信息。 你可能会得到更多的细节来解决你的问题。

 import org.apache.log4j.BasicConfigurator; 

调用这个方法

 BasicConfigurator.configure(); 

我的log4j被固定在属性文件下面:

 ## 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=./logs/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 

如果我们在log4j上使用apache commons logging wrapper,那么我们需要在classpath中有两个jar可用。 此外, commons-logging.propertieslog4j.properties/xml commons-logging.properties应该在类路径中可用。

我们也可以使用-Dorg.apache.commons.logging.Log=<logging implementation class name> -Dlog4j.configuration=<file:location of log4j.properties/xml file>将实现类和log4j.properties名称传递为JAVA_OPTS 。 在app / web服务器的情况下,可以通过设置JAVA_OPTS来完成。

这将有助于将部署中可以改变的属性外部化。

这是一个使用.yaml的替代方法

逻辑结构:

 Configuration: Properties: Appenders: Loggers: 

样品:

 Configutation: name: Default Properties: Property: name: log-path value: "logs" Appenders: Console: name: Console_Appender target: SYSTEM_OUT PatternLayout: pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" File: name: File_Appender fileName: ${log-path}/logfile.log PatternLayout: pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" Loggers: Root: level: debug AppenderRef: - ref: Console_Appender Logger: - name: <package>.<subpackage>.<subsubpackage>.<...> level: debug AppenderRef: - ref: File_Appender level: error 

Ref: LOG4J 2配置:使用YAML

    Interesting Posts