81

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

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

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

有没有办法得到我所追求的?

4

5 回答 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
于 2009-04-08T02:55:03.233 回答
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 消息,包括调试级别的消息。

于 2009-04-08T17:57:27.340 回答
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”可以列出多个附加程序。我试图一次做一行。

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

于 2009-05-06T14:03:20.527 回答
3

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

至于捕捉 DEBUG 并且除此之外什么都没有……您可能必须编写一个自定义附加程序。

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

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

演示链接:https ://github.com/RazvanSebastian/spring_multiple_log_files_demo.git

我的解决方案基于 XML 配置,使用spring-boot-starter-log4j. 该示例是使用spring-boot-starter两个 Logger 写入不同日志文件的基本示例。

于 2019-02-01T14:24:01.257 回答