Log4j:如何配置多个appender:一个指向控制台和一个文件,另一个严格指向文件?

时间:2011-09-22 11:50:38

标签: java log4j

对于我的应用程序,我已设法配置log4j以生成多个日志。

两个appender都输出到控制台和文件。
但由于第一个日志是我的主日志,我觉得这个日志应该是输出到控制台的唯一日志。

是否可以禁用第二个日志,以便log4j不使用控制台但仍然写入文件?

log4j.rootLogger=DEBUG, stdout

# stdout is set to be ConsoleAppender sending its output to System.out
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss SSS}ms %-5p [%t] - %m%n

log4j.appender.X=org.apache.log4j.FileAppender
log4j.appender.X.File=X.log
log4j.appender.X.Append=false 
log4j.appender.X.layout=org.apache.log4j.PatternLayout
log4j.appender.X.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss SSS}ms %-5p [%t] - %m%n
log4j.logger.X=DEBUG,X

第二个appender'Y'的配置方式与'X'相同。

我还在考虑完全禁用两个appender的控制台并使用:在shell窗口中使用tail -f X.log查看日志,但在Eclipse内部工作时这不太实用。

任何提示都将不胜感激。

问候,

3 个答案:

答案 0 :(得分:2)

我知道的唯一方法是禁用某些记录器(类别)的可加性,以便将它们指向一个appender或另一个。 E.g。

log4j.logger.com.foo.bar=INFO, X
log4j.additivity.com.foo.bar=false

答案 1 :(得分:2)

如何不将根记录器输出到stdout,而是将X记录器发送到X和stdout appender?这样你的Y记录器也不会输出到stdout。

log4j.logger.X=DEBUG,X,stdout

答案 2 :(得分:1)

  

两个appender都输出到控制台和文件。

我认为你对记录器和追加器之间的区别感到困惑。

appender只能到达一个地方 - 在您的配置中,您已经声明了ConsoleAppender和FileAppender。这是两个独立的实体。这些appender都不会输出到多个位置。

可以将记录器配置为将输出发送到零到多个appender,并且已配置所有记录器以通过rootLogger将其输出发送到控制台。

如果您希望只有某些记录器将输出发送到控制台,则不要将根记录器配置为使用控制台,而是仅使用特定的记录器名称来执行此操作。

如果您想让所有记录器 X将其输出发送到控制台,那么您需要禁用X的可加性,以便它不会继承根记录器。