使用log4j创建多个具有不同内容的日志文件


81

有没有一种方法可以配置log4j,以便将不同级别的日志记录输出到不同的附加程序?

我正在尝试设置多个日志文件。主日志文件将捕获所有类的所有INFO及以上消息。(在开发中,它将捕获所有DEBUG及以上消息,并捕获特定类的TRACE。)

然后,我想要一个单独的日志文件。该日志文件将捕获类的特定子集的所有DEBUG消息,而忽略任何其他类的所有消息。

有没有办法得到我想要的东西?

谢谢,丹

java  log4j 

3
您是说要一个日志文件捕获DEBUG且仅捕获DEBUG,另一个日志文件捕获INFO而仅捕获INFO,依此类推吗?
Eddie

Answers:


70

这应该使您开始:

log4j.rootLogger=QuietAppender, LoudAppender, TRACE
# setup A1
log4j.appender.QuietAppender=org.apache.log4j.RollingFileAppender
log4j.appender.QuietAppender.Threshold=INFO
log4j.appender.QuietAppender.File=quiet.log
...


# setup A2
log4j.appender.LoudAppender=org.apache.log4j.RollingFileAppender
log4j.appender.LoudAppender.Threshold=DEBUG
log4j.appender.LoudAppender.File=loud.log
...

log4j.logger.com.yourpackage.yourclazz=TRACE

3
最后一行是做什么的?
djangofan 2012年

1
@djangofan设置了自定义的包/类日志级别(即使用TRACE日志记录的com.yourpackage.yourclazz),尽管在这种情况下它已经是默认设置(在第1行设置),所以它什么也不做。在IMO中,如果rootLogger具有INFO且“ yourclass”具有DEBUG,则此示例会更好。
汤姆·克利夫特

第一行的参数应该是TRACE,QuietAppender,LoudAppender而不是QuietAppender,LoudAppender,TRACE
Richard Whitehead

26

也许像这样?

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 <!-- general application log -->
 <appender name="MainLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="server.log" />
  <param name="Threshold" value="INFO" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender> 
 <!-- additional fooSystem logging -->
 <appender name="FooLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="foo.log" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender>
 <!-- foo logging -->
 <logger name="com.example.foo">
  <level value="DEBUG"/>
  <appender-ref ref="FooLogFile"/>
 </logger>
 <!-- default logging -->
 <root>
  <level value="INFO"/>
  <appender-ref ref="MainLogFile"/>
 </root>
</log4j:configuration>

因此,所有信息消息都被写入server.log; 相比之下,foo.log仅包含com.example.foo消息,包括调试级别的消息。


com.example.foo是包还是类?
WowBow

1
@WowBow也可以,但名称类似包装。为记录器使用类名只是一个惯例
araqnid 2015年

谢谢。我问了两个之后都尝试了;)
WowBow

7

我有这个问题,但是有一个转折-我试图将不同的内容记录到不同的文件中。我有有关LowLevel调试日志和HighLevel用户日志的信息。我希望LowLevel仅转到一个文件,而HighLevel仅转到一个文件和syslogd。

我的解决方案是配置3个追加程序,然后像这样设置日志记录:

log4j.threshold=ALL
log4j.rootLogger=,LowLogger

log4j.logger.HighLevel=ALL,Syslog,HighLogger
log4j.additivity.HighLevel=false

我很难弄清的部分是'log4j.logger'可能列出了多个附加程序。我试图一次做到这一点。

希望这可以在某个时候对某人有所帮助!


3

对于主日志文件/附加程序,设置a.Threshold = INFO可以将追加程序中实际记录的内容限制为INFO及更高版本,无论记录器是否启用了DEBUG,TRACE等。

至于捕获DEBUG并没有其他东西……您可能必须编写一个自定义附加程序。

但是,我建议不要这样做,因为这听起来会使故障排除和分析变得非常困难:

  1. 如果您的目标是只有一个文件来查找故障,那么将日志数据跨越不同的文件将很烦人-除非您有严格的日志记录策略,否则可能需要DEBUG和INFO的内容来能够有效地跟踪有问题的代码的执行。
  2. 通过仍然记录所有调试消息,您将失去日志记录(方式),从而失去通常在生产系统中获得的任何性能提升。

我应该更好地解释我的目标。主日志用于跟踪应用程序中任何位置的错误,异常情况等-该日志必须保持较小,以便定期滚动。特殊日志跟踪一个子系统的行为,需要长时间保存。

您是否要从第二个日志文件中排除ERROR,WARN,INFO消息?
马特b

在XML中,您可以像这样添加参数Threshold:<appender name =“ ERROR_FILE”> <param name =“ Threshold” value =“ ERROR” /> </ appender>
razor

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.