【问题标题】:Log4j with two outputs with log4j.properties?Log4j 有两个输出和 log4j.properties?
【发布时间】:2013-09-15 03:35:16
【问题描述】:

我想使用 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 中进行哪些更改?

【问题讨论】:

  • 只有一个问题,我才能帮你;为什么要创建 Logwriter,当您可以使用 log4j api 及其配置自定义整个日志写入时?
  • 当 Log4J 提供自定义文件记录器时,为什么要使用自定义文件记录器?您只需在 log4j.properties 文件中再配置一个附加程序。
  • 嗯,不知何故,很多例子都有一个自定义的日志记录类......这可能是问题吗?
  • 您是否想重新发明同一个轮子?在您的 log4j 中添加 ConsoleAppender 和 FileAppender,您可以在这两个地方获取日志。您能更具体地说明您想要实现的目标吗?

标签: java file logging configuration log4j


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,我删除了输出块,解决了我的问题
猜你喜欢
  • 2012-10-20
  • 2017-10-26
  • 2016-08-29
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多