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

81

有没有一种方法可以配置log4j,使其将不同级别的日志输出到不同的appender中?

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

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

是否有办法实现我的要求?


3
你的意思是希望有一个日志文件只记录DEBUG级别的信息,另一个日志文件只记录INFO级别的信息,以此类推? - Eddie
5个回答

71

以下内容可以帮助你入门:

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

4
最后一行代码的作用是什么? - djangofan
1
@djangofan 设置了一个自定义的包/类日志级别(即 com.yourpackage.yourclazz 使用 TRACE 日志记录),尽管在这种情况下它已经是默认设置(在第1行设置),所以它什么也没做。我认为如果 rootLogger 设置为 INFO,而 "yourclass" 设置为 DEBUG,则此示例会更好。 - Tom Clift
1
第一行的参数应该是 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
谢谢。我在询问后尝试了两种方法,对于两种方法都有效 ;) - WowBow

7
我有一个问题,但是有些变化——我试图将不同的内容记录到不同的文件中。我有一个LowLevel调试日志和一个HighLevel用户日志的信息。我希望LowLevel只记录在一个文件中,而HighLevel则要同时记录在一个文件和syslogd中。
我的解决方法是配置三个appender,然后像这样设置日志:
log4j.threshold=ALL
log4j.rootLogger=,LowLogger

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

对我来说难以理解的部分是'log4j.logger'可以列出多个附加器。我一直试图一行一行地完成它。

希望这能在某个时候帮助到某个人!


3
对于主记录文件/附加程序,设置一个.Threshold = INFO,以将实际记录在附加程序中的内容限制为INFO及以上,无论记录器是否启用了DEBUG、TRACE等。
至于捕获DEBUG以及以上级别日志……你可能需要编写自定义附加程序。
但我建议不要这样做,因为它听起来会使故障排除和分析变得非常困难:
  1. 如果您的目标是有一个单一的文件来查找问题,那么将日志数据跨越不同的文件将会很麻烦——除非您有一个非常严格的日志记录策略,否则您可能需要来自DEBUG和INFO的内容才能有效地跟踪出错代码的执行。
  2. 通过仍记录所有调试消息,您正在失去通常通过关闭(方式)日志记录而获得的任何性能增益。

我应该更好地解释我的目标。主日志用于跟踪应用程序中的错误、异常情况等——此日志需要保持较小,因此需要定期回滚。特殊日志跟踪一个子系统的行为,并需要长时间保留。 - Daniel
你想从第二个日志文件中排除 ERROR、WARN、INFO 消息吗? - matt b
在 XML 中,您可以像这样添加参数 Threshold: <appender name="ERROR_FILE"> <param name="Threshold" value="ERROR"/> </appender> - razor

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接