Log4j有两个带log4j.properties的输出?

时间:2013-09-11 07:55:25

标签: java file logging configuration log4j

我想使用Log4j API但是我遇到了一些配置问题。

这是我的LogWriter类:

public class LogWriter {
    static Logger logger = Logger.getLogger(LogWriter.class);

    public LogWriter(String logFilePath) {
        File outFile = new File(logFilePath);
        try {
            PrintStream outStream = new PrintStream(new FileOutputStream(outFile));
            System.setOut(outStream));    
            System.setErr(outStream);
        } catch (FileNotFoundException e) {
            throw new IllegalArgumentException("File not Found");
        }
        BasicConfigurator.configure();
    }

    public void write(String infoString) {
        logger.info(infoString);
    }
}

现在这很好用,但我不能同时写入Logger-File和Console(可能是因为System.setOut

我添加了一个log4j.properties文件,如下所示:

# Root logger option
log4j.rootLogger=INFO, console

# Direct log messages to console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-5p- %m%n

现在我的问题是,如何让我的LogWriter和log4j.properties文件一起工作,以便输出进入Logger-File和Console? 我在LogWriter中需要更改什么?

1 个答案:

答案 0 :(得分:1)

在安装LogWriter之前,您必须保留System.outSystem.err中存储的原始参考文件的副本。用它们写一个新的appender。配置log4j以在log4j.appender.console中使用此appender。

背景:默认log4j ConsoleAppender只写入System.out。如果你改变它,log4j将使用你提供的任何东西。无法将ConsoleAppender配置为在其他位置编写。在LogWriter中,无法区分来自log4j和System.out.println()的输出。

所以唯一的解决方案是编写另一个写入原始System.out的appender。

也就是说,使用原始ConsoleAppender并使用FileAppender代替您自己的LogWriter可能会更聪明。只需确保您不会在代码中的任何位置直接使用System.out