Log4j:如何configuration最简单的文件logging?

我的故事:

我想做一个简单的事情,就像将日志logging到一个文件中的一个最简单的log4jlogging器一样简单。 我发现了一些function的例子,但不是一个真正有用的基本的,一般的例子,而不是一个解释每一行如何工作的例子。

题:

有人可以提供吗?

先决条件:

  • 我已经知道在哪里放置文件,我已经configuration了log4j,并为控制台日志logging工作。
  • 现在我想login到一个文件,并在程序运行后从文件系统中find文件。
  • 需要将行添加到现有的log4j.properties文件是所需的输出。

我有一个通用的log4j.xml文件给你:

 <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > <log4j:configuration debug="false"> <appender name="default.console" class="org.apache.log4j.ConsoleAppender"> <param name="target" value="System.out" /> <param name="threshold" value="debug" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" /> </layout> </appender> <appender name="default.file" class="org.apache.log4j.FileAppender"> <param name="file" value="/log/mylogfile.log" /> <param name="append" value="false" /> <param name="threshold" value="debug" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" /> </layout> </appender> <appender name="another.file" class="org.apache.log4j.FileAppender"> <param name="file" value="/log/anotherlogfile.log" /> <param name="append" value="false" /> <param name="threshold" value="debug" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" /> </layout> </appender> <logger name="com.yourcompany.SomeClass" additivity="false"> <level value="debug" /> <appender-ref ref="another.file" /> </logger> <root> <priority value="info" /> <appender-ref ref="default.console" /> <appender-ref ref="default.file" /> </root> </log4j:configuration> 

与一个控制台,两个文件appender和一个loggingpoiting第二个文件appender而不是第一个。

编辑

在其中一个较老的项目中,我find了一个简单的log4j.properties文件:

 # For the general syntax of property based configuration files see # the documentation of org.apache.log4j.PropertyConfigurator. # The root category uses two appenders: default.out and default.file. # The first one gathers all log output, the latter only starting with # the priority INFO. # The root priority is DEBUG, so that all classes can be logged unless # defined otherwise in more specific properties. log4j.rootLogger=DEBUG, default.out, default.file # System.out.println appender for all classes log4j.appender.default.out=org.apache.log4j.ConsoleAppender log4j.appender.default.out.threshold=DEBUG log4j.appender.default.out.layout=org.apache.log4j.PatternLayout log4j.appender.default.out.layout.ConversionPattern=%-5p %c: %m%n log4j.appender.default.file=org.apache.log4j.FileAppender log4j.appender.default.file.append=true log4j.appender.default.file.file=/log/mylogfile.log log4j.appender.default.file.threshold=INFO log4j.appender.default.file.layout=org.apache.log4j.PatternLayout log4j.appender.default.file.layout.ConversionPattern=%-5p %c: %m%n 

有关所有布局参数的说明,请参阅: log4j PatternLayout参数

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false"> <appender name="fileAppender" class="org.apache.log4j.RollingFileAppender"> <param name="Threshold" value="INFO" /> <param name="File" value="sample.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" /> </layout> </appender> <root> <priority value ="debug" /> <appender-ref ref="fileAppender" /> </root> </log4j:configuration> 

Log4j可能有点混乱。 因此,让我们试着了解这个文件中发生了什么:在log4j中,你有两个基本的构造appender和logging器。

Appender定义如何和在什么地方附加。 它会logging到文件,控制台,数据库等? 在这种情况下,您指定将使用layout标签中指定的模式将指向fileAppender的日志语句放入文件sample.log中。 您可以轻松地为控制台或数据库创build一个appender。 在控制台appender将指定的东西,如屏幕上的布局和数据库appender将具有连接的细节和表名称。

logging仪在logging事件发生时响应。 如果一个事件捕捉到特定logging器的兴趣,它将调用其附加的appender。 在下面的例子中,只有一个logging器是根logging器 – 默认情况下响应所有logging事件。 除了根logging器,您还可以指定更多特定的logging器来响应特定包中的事件。 这些logging器可以使用appender-ref标签指定自己的appender,否则将从根logging器inheritanceappender。 使用更具体的logging程序可以让您精确调整特定程序包的日志级别,或者将某些程序包定向到其他appender。

那么这个文件说的是:

  1. 创build一个logging到文件sample.log的fileAppender
  2. 将该appender附加到根logging器。
  3. 根logging器将响应任何至less与“debugging”级别相同的事件
  4. appender被configuration为只logging至less与'info'一样详细的事件

净出口是,如果你有一个logger.debug("blah blah")在你的代码将被忽略。 logger.info("Blah blah"); 将输出到sample.log。

下面的代码片段可以通过log4j标签添加到上面的文件中。 这个logging器会从<root>inheritanceappender,但会将包org.springframework的所有日志logging事件限制为logging级别info或更高级别的事件。

  <!-- Example Package level Logger --> <logger name="org.springframework"> <level value="info"/> </logger> 

这是我经常使用的简单的一个:

 # Set up logging to include a file record of the output # Note: the file is always created, even if there is # no actual output. log4j.rootLogger=error, stdout, R # Log format to standard out log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern= %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n # File based log output log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=owls_conditions.log log4j.appender.R.MaxFileSize=10000KB # Keep one backup file log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern= %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n 

日志的格式如下:

 ERROR [2009-09-13 09:56:01,760] [main] (RDFDefaultErrorHandler.java:44) http://www.xfront.com/owl/ontologies/camera/#(line 1 column 1): Content is not allowed in prolog. 

这种格式由string%5p\t[%d] [%t] (%F:%L)\n \t%m%n\n 。 你可以在log4j javadoc中读取PatternLayout的转换字符的含义。

包含的评论应该有助于理解它的function。 进一步说明:

  • 它logging到控制台和文件; 在这种情况下,该文件被命名为owls_conditions.log :根据您的需要更改它;
  • 文件在达到10000KB时进行旋转,并保留一个备份文件

这是一个log4j.properties文件,我已经使用了很大的成功。

 logDir=/var/log/myapp log4j.rootLogger=INFO, stdout #log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{MM/dd/yyyy hh:mm:ss a}|%-5p|%-30c{1}| %m%n log4j.appender.stdout.DatePattern='.'yyyy-MM-dd log4j.appender.stdout.File=${logDir}/myapp.log log4j.appender.stdout.append=true 

DailyRollingFileAppender将每天创build新文件,文件名如下所示:

 myapp.log.2017-01-27 myapp.log.2017-01-28 myapp.log.2017-01-29 myapp.log <-- today's log 

日志文件中的每个条目都将具有以下格式:

 01/30/2017 12:59:47 AM|INFO |Component1 | calling foobar(): userId=123, returning totalSent=1 01/30/2017 12:59:47 AM|INFO |Component2 | count=1 > 0, calling fooBar() 

通过使用-Dlog4j.configuration设置上述文件的位置,如本文所述:

 java -Dlog4j.configuration=file:/home/myapp/config/log4j.properties com.foobar.myapp 

在您的Java代码中,确保在实例化logging器对象时设置每个软件组件的名称。 我也喜欢login到日志文件和标准输出,所以我写了这个小函数。

 private static final Logger LOGGER = Logger.getLogger("Component1"); public static void log(org.apache.log4j.Logger logger, String message) { logger.info(message); System.out.printf("%s\n", message); } public static String stackTraceToString(Exception ex) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); ex.printStackTrace(pw); return sw.toString(); } 

然后像这样调用它:

 LOGGER.info(String.format("Exception occurred: %s", stackTraceToString(ex)));