java - Log4j 具有 log4j.properties 的两个输出?

标签 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);
    }
}

现在工作正常,但我无法同时写入记录器文件和控制台(可能是因为 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 文件一起工作,以便输出进入记录器文件和控制台? 我必须在 LogWriter 中更改哪些内容?

最佳答案

在安装 LogWriter 之前,您必须将存储在 System.outSystem.err 中的原始引用的副本保留在某处。使用它们来编写一个新的附加程序。在 log4j.appender.console 中配置 log4j 以使用此附加程序。

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

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

也就是说,使用原始的 ConsoleAppender 并使用 FileAppender 而不是您自己的 LogWriter 可能会更明智。只要确保您永远不会在代码中的任何地方直接使用 System.out 即可。

关于java - Log4j 具有 log4j.properties 的两个输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18735629/

相关文章:

java - Apache Derby [Hibernate 框架] 看不到创建的表。 [Java EE + JSP]

c - 使用双指针和 malloc 读取文件

logging - 如何抑制Spark中的拼花日志消息?

parsing - 用于解析 SMTP 日志以查找退回邮件的工具

java - Libgdx for android 在主屏幕前显示黑色

java - 我如何从 Java 中的 Delphi 读取我的 Json 字符串

java - Git 中 rebase 的工作原理

c++ - 在文本文件中间附加字符串

logging - Azure - 无法部署 -Windows Azure 无法在服务包中找到资源 MyCustomLogs