使用log4j配置在CLI分离Stderr和stdout流

时间:2016-08-11 13:37:22

标签: ant log4j

我有一个基于ANT的应用程序,我使用slf4j记录器来记录异常,信息,致命等等。它工作正常。我使用log4j配置来记录详细信息。为此,我使用了slf4j-log4j12-1.5.2.jar。以下是日志的配置。

log4j.rootLogger=info, file, stdout, stderr
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=cmd.log
log4j.appender.file.MaxFileSize=1024KB
log4j.appender.file.MaxBackupIndex=4
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} %-5p (%13F:%L) %3x - %m%n

log4j.appender.errorFile=org.apache.log4j.RollingFileAppender
log4j.appender.errorFile.File=error_stream.log
log4j.appender.errorFile.MaxFileSize=1024KB
log4j.appender.errorFile.MaxBackupIndex=4
log4j.appender.errorFile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorFile.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} %-5p (%13F:%L) %3x - %m%n
log4j.appender.errorFile.Threshold=ERROR

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss} %5p - %m%n

log4j.appender.stderr=org.apache.log4j.ConsoleAppender
log4j.appender.stderr.Threshold=WARN
log4j.appender.stderr.Target=System.err
log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
log4j.appender.stderr.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss} %5p - %m%n

我通过ant脚本调用我的应用程序作为ant -f build.xml 1> out.txt 2> err.txt 现在它应该将所有错误流式传输到err.txt。但它进入了out.txt

注意:它可以创建error_stream.log并有错误。但不是在err.txt

我使用错误的配置属性吗?

2 个答案:

答案 0 :(得分:0)

您是否正在尝试为ANT启动的应用程序定义日志记录?或者您是否正在尝试为ANT定义日志记录(封装应用程序的过程)?

如果是后者,那么ANT支持loggers and listeners,例如:

答案 1 :(得分:0)

ant Task类存在问题。它处理ErrorOutput为"警告"并且进一步警告流入输出流。

您可以使用以下更改修改ant.jar。它会起作用。

<强> Task_before_changes.java

    protected void handleErrorOutput(String output) {
    log(output, Project.MSG_WARN);
}

<强> Task_after_changes.java

protected void handleErrorOutput(String output) {
    log(output, Project.MSG_ERR);
}