如何使用Log4j在Windows和Tomcat 5.5环境下将stdout和stderr写入/捕获到文件中?

8

我正在使用Windows 2008 R2和Apache Tomcat 5.5,供您参考。

通过Logging选项卡 -> Redirect Stdout和Redirect Stderror文本框,可以通过Apache Tomcat属性自动记录STDOUT和STDERR日志。

但我想通过log4j来控制这个过程。

我试图利用ConsoleAppender和TimeAndSizeRollingAppender类来滚动通常由Apache Tomcat固有日志控制的内容。

基本上,无论Tomcat如何将stdout和stderr重定向到文件,我都希望使用log4j和log4j.properties文件实现相同的功能。

我在这个网站和其他类似的网站 (log4j redirect stdout to DailyRollingFileAppender) 以及这个网站 (http://sysgears.com/articles/how-to-redirect-stdout-and-stderr-writing-to-a-log4j-appender#comment-749) 上进行了一些调查,但是我遇到了几个基本问题:

  1. 我应该如何编译这些类?应该设置什么类路径?我尝试从 sysgears 的链接中编译类,但返回了 7 个错误,例如找不到符号 Class Logger 和符号 Class OutputStream。

  2. 编译后,特别是从 sysgears 的链接中,我该如何使用这个类?它说明要使用这个类,只需编写:

    System.setErr(new PrintStream(new LoggingOutputStream( System.err, Logger.getLogger("outLog"), Level.ERROR)));

太好了,但我应该在哪里编写它?在单独的文件中吗?Tomcat属性中吗?

我会非常感激任何帮助。

非常感谢您的时间。

更新:

这是我的完整log4j.properties文件:

log4j.rootLogger=INFO, CATALINA, LOCALHOST, MANAGER, HOST-MANAGER, ADMIN, CONSOLE

# Define all the appenders
log4j.appender.CATALINA=org.apache.log4j.appender.TimeAndSizeRollingAppender
log4j.appender.CATALINA.file=D:/Program Files (x86)/Apache Software Foundation/Tomcat-      5.5.28/logs/catalina.log
log4j.appender.CATALINA.Threshold=DEBUG
log4j.appender.CATALINA.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.CATALINA.layout=org.apache.log4j.PatternLayout
log4j.appender.CATALINA.MaxFileSize=20KB
log4j.appender.CATALINA.DateRollEnforced=true
log4j.appender.CATALINA.MaxRollFileCount=100
log4j.appender.CATALINA.ScavengeInterval=-1
log4j.appender.CATALINA.BufferedIO=false
log4j.appender.CATALINA.CompressionAlgorithm=ZIP
log4j.appender.CATALINA.layout.conversionPattern = %-5p %-23d{ISO8601} [%t] %x: %c{1} - %m%n

log4j.appender.LOCALHOST=org.apache.log4j.appender.TimeAndSizeRollingAppender
log4j.appender.LOCALHOST.file=D:/Program Files (x86)/Apache Software Foundation/Tomcat-5.5.28/logs/localhost.log
log4j.appender.LOCALHOST.Threshold=DEBUG
log4j.appender.LOCALHOST.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.LOCALHOST.layout=org.apache.log4j.PatternLayout
log4j.appender.LOCALHOST.MaxFileSize=20KB
log4j.appender.LOCALHOST.DateRollEnforced=true
log4j.appender.LOCALHOST.MaxRollFileCount=100
log4j.appender.LOCALHOST.ScavengeInterval=-1
log4j.appender.LOCALHOST.BufferedIO=false
log4j.appender.LOCALHOST.CompressionAlgorithm=ZIP
log4j.appender.LOCALHOST.layout.conversionPattern = %-5p %-23d{ISO8601} [%t] %x: %c{1} - %m%n

log4j.appender.MANAGER=org.apache.log4j.appender.TimeAndSizeRollingAppender
log4j.appender.MANAGER.file=D:/Program Files (x86)/Apache Software Foundation/Tomcat-5.5.28/logs/manager.log
log4j.appender.MANAGER.Threshold=DEBUG
log4j.appender.MANAGER.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.MANAGER.layout=org.apache.log4j.PatternLayout
log4j.appender.MANAGER.MaxFileSize=20KB
log4j.appender.MANAGER.DateRollEnforced=true
log4j.appender.MANAGER.MaxRollFileCount=100
log4j.appender.MANAGER.ScavengeInterval=-1
log4j.appender.MANAGER.BufferedIO=false
log4j.appender.MANAGER.CompressionAlgorithm=ZIP
log4j.appender.MANAGER.layout.conversionPattern = %-5p %-23d{ISO8601} [%t] %x: %c{1} - %m%n

log4j.appender.HOST-MANAGER=org.apache.log4j.appender.TimeAndSizeRollingAppender
log4j.appender.HOST-MANAGER.file=D:/Program Files (x86)/Apache Software Foundation/Tomcat-5.5.28/logs/host-manager.log
log4j.appender.HOST-MANAGER.Threshold=DEBUG
log4j.appender.HOST-MANAGER.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.HOST-MANAGER.layout=org.apache.log4j.PatternLayout
log4j.appender.HOST-MANAGER.MaxFileSize=20KB
log4j.appender.HOST-MANAGER.DateRollEnforced=true
log4j.appender.HOST-MANAGER.MaxRollFileCount=100
log4j.appender.HOST-MANAGER.ScavengeInterval=-1
log4j.appender.HOST-MANAGER.BufferedIO=false
log4j.appender.HOST-MANAGER.CompressionAlgorithm=ZIP
log4j.appender.HOST-MANAGER.layout.conversionPattern = %-5p %-23d{ISO8601} [%t] %x: %c{1} - %m%n

log4j.appender.ADMIN=org.apache.log4j.appender.TimeAndSizeRollingAppender
log4j.appender.ADMIN.file=D:/Program Files (x86)/Apache Software Foundation/Tomcat-5.5.28/logs/admin.log
log4j.appender.ADMIN.Threshold=DEBUG
log4j.appender.ADMIN.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.ADMIN.layout=org.apache.log4j.PatternLayout
log4j.appender.ADMIN.MaxFileSize=20KB
log4j.appender.ADMIN.DateRollEnforced=true
log4j.appender.ADMIN.MaxRollFileCount=100
log4j.appender.ADMIN.ScavengeInterval=-1
log4j.appender.ADMIN.BufferedIO=false
log4j.appender.ADMIN.CompressionAlgorithm=ZIP
log4j.appender.ADMIN.layout.conversionPattern = %-5p %-23d{ISO8601} [%t] %x: %c{1} - %m%n

# Configure which loggers log to which appenders
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=INFO, LOCALHOST
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager]=\
INFO, MANAGER
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager]=\
INFO, HOST-MANAGER
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/admin]=\
INFO, ADMIN

只是为了确认我对问题的理解,您已经按照文档(http://tomcat.apache.org/tomcat-5.5-doc/logging.html)配置了Log4J和Tomcat。只是您没有在日志中获取STDOUT和STDERR,对吗? - Edwin Dalorzo
是的,那是正确的。我在原帖中发布了完整的log4j.properties文件。无论如何,我只想使用log4j将STDOUT和STDERR记录到日志文件中。谢谢。 - user717236
2个回答

3

1) 我该如何编译这些类?需要设置什么类路径?我尝试从sysgears链接中编译类,但返回了7个错误,例如找不到符号Class Logger和符号Class OutputStream。

您需要在类路径上拥有log4j jar,并在文件顶部导入正确的类。类似于以下内容:

import java.io.PrintStream;
import java.io.OutputStream;
import org.apache.log4j.Logger;

好的,谢谢。我按照你说的做了,将那些类导入到文件顶部并直接指定了类路径。这是我输入的内容(请注意,命令行提示符相对于类路径的文件夹)-->“javac -cp log4j-1.2.16.jar LoggingOutputStream.java”(不带引号)。我得到了4个错误,所有错误都指向找不到符号类Level和IOException。我的完整导入如下:import java.io.PrintStream; import java.io.OutputStream; import java.io.IOException;import java.util.logging.Level; import java.util.logging.Logger; - user717236
找到所有缺失的导入并导入它们。IOException 是 java.io.IOException,Level 是 org.apache.log4j.Level。 - sbridges
谢谢,我找到了缺失的导入并且编译成功了。你太棒了,谢谢。唯一让我困惑的是如何使用这个类(请参见我上面编辑过的原始帖子)以及log4j.properties文件。在sysgears的链接中,它提到要写几行代码来使用他们的类,但它没有说明要将其写到哪里?我不知道他们是否暗示要使用Tomcat或者将其写入一个单独的.java文件并进行编译,还是其他什么方式。我毫无头绪。任何帮助都将不胜感激,再次感谢。 - user717236
1
如果你觉得他的帖子有帮助,请至少礼貌地点个赞,就像我做的一样。 - Hovercraft Full Of Eels
点赞?我不明白。我是发帖者,我觉得所有的回答都很有帮助,谢谢。 - user717236
如果您发布了一个问题,您可以接受一个答案。一旦您的声望值大于15,您也可以给一个答案点赞。 - sbridges

3

您可以通过添加器来实现此功能:

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold = DEBUG
log4j.appender.stdout.Target   = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ISO8601} %-5p [%F:%L] : %m%n

然后,您可以将此 appender 与您的 logger 一起使用,例如:
log4j.rootLogger = DEBUG, stdout

当然,您可以使用上面的目标,也许与System.err一起使用。
希望这有所帮助。
祝好, Christian

你好,感谢你的帮助。不幸的是,这并没有提供我正在寻找的解决方案。使用ConsoleAppender,它保存在哪个文件中?我想使用stdout和stderr上的滚动来控制其大小和备份。我在sysgear类上卡住了,不知道如何与log4j.properties一起使用。谢谢。 - user717236

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