0

我想使用 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 和控制台(可能是因为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 和控制台?我必须在我的 LogWriter 中进行哪些更改?

4

1 回答 1

1

在安装之前,您必须保留存储在某处的LogWriter原始参考的副本。使用它们来编写一个新的 appender。配置 log4j 以在.System.outSystem.errlog4j.appender.console

背景:默认 log4jConsoleAppender只写入System.out. 如果您更改它,log4j 将使用您提供的任何内容。无法配置ConsoleAppender为在其他地方写入。在您的LogWriter中,无法区分来自 log4j 和System.out.println().

所以唯一的解决方案是编写另一个写入原始的附加程序System.out

也就是说,使用原始文件ConsoleAppender并使用 aFileAppender而不是您自己的LogWriter. 只要确保你从不System.out在代码中的任何地方直接使用。

于 2013-09-11T08:07:11.907 回答